Binary Tree Preorder Traversal
递归
复杂度
时间O(n), 空间O(1)
代码
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
traverse(root, result);
return result;
}
private void traverse(TreeNode root, ArrayList<Integer> result){
if (root == null){
return;
}
result.add(root.val);
traverse(root.left, result);
traverse(root.right, result);
}
迭代
复杂度
时间O(n), 空间O(logn) 因为在遍历过程中,栈中最多会存储从root到最深的leave这一条path上的全部node,即树高O(lgn)
代码
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) {
return res;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
while (root != null || !stack.isEmpty()) {
if (root != null) {
stack.push(root);
res.add(root.val);
root = root.left;
} else {
root = stack.pop();
root = root.right;
}
}
return res;
}
Binary Tree Preorder Traversal
递归
复杂度
时间O(n), 空间O(1)
代码
public List<Integer> preorderTraversal(TreeNode root) {
ArrayList<Integer> result = new ArrayList<Integer>();
traverse(root, result);
return result;
}
private void traverse(TreeNode root, ArrayList<Integer> result){
if (root == null){
return;
}
result.add(root.val);
traverse(root.left, result);
traverse(root.right, result);
}
Binary Tree Inorder Traversal
迭代
复杂度
时间O(n), 空间O(logn) 因为在遍历过程中,栈中最多会存储从root到最深的leave这一条path上的全部node,即树高O(lgn)
代码
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) {
return res;
}
helper(res, root);
return res;
}
public void helper(List<Integer> res, TreeNode root) {
if (root == null) {
return;
}
helper(res, root.left);
res.add(root.val);
helper(res, root.right);
}
递归
复杂度
时间O(n), 空间O(1)
代码
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) {
return res;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
while (!stack.isEmpty() || root != null) {
if (root != null) {
stack.push(root);
root= root.left;
} else {
root = stack.pop();
res.add(root.val);
root = root.right;
}
}
return res;
}
Binary Tree Postorder Traversal
递归
复杂度
时间O(n), 空间O(1)
代码
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) {
return res;
}
helper(res, root);
return res;
}
public void helper(List<Integer> res, TreeNode root) {
if (root == null) {
return;
}
helper(res, root.left);
helper(res, root.right);
res.add(root.val);
}
迭代
说明
在出栈的时候需要分情况一下:
1)如果当前栈顶元素的右结点存在并且还没访问过(也就是右结点不等于上一个访问结点),那么就把当前结点移到右结点继续循环;
2)如果栈顶元素右结点是空或者已经访问过,那么说明栈顶元素的左右子树都访问完毕,应该访问自己继续回溯了。
复杂度
时间O(n), 空间O(logn) 因为在遍历过程中,栈中最多会存储从root到最深的leave这一条path上的全部node,即树高O(lgn)
代码
public List<Integer> postorderTraversal(TreeNode root) {
List<Integer> res = new ArrayList<Integer>();
if (root == null) {
return res;
}
TreeNode pre = null;
Stack<TreeNode> stack = new Stack<TreeNode>();
while (root != null || !stack.isEmpty()) {
if (root != null) {
stack.push(root);
root = root.left;
} else {
TreeNode peak = stack.peek();
if (peak.right != null && pre != peak.right) {//如果当前栈顶元素的右结点存在并且还没访问过(也就是右结点不等于上一个访问结点)就访问右结点 /
root = peak.right;
} else {//如果栈顶元素右结点是空或者已经访问过,那么说明栈顶元素的左右子树都访问完毕 需要把栈顶元素加入结果并且回溯上一层
stack.pop();
res.add(peak.val);
pre = peak;
}
}
}
return res;
}
Binary Tree Level Order Traversal I & II
说明
类似树的广度优先搜索, 用queue来实现, 使用queue保存每层的节点。出队和将子节点入队的实现使用 for 循环,将每一轮的节点输出。
Queue是接口, LinkedList可以实现此接口。
复杂度
时间O(n) 空间 O(n)
代码
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res= new ArrayList<List<Integer>>();
if (root == null) {
return res;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty() ) {
int size = queue.size();
List<Integer> tem = new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
tem.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
res.add(tem);
//res.add(0, tem); //for II
}
return res;
}
Binary Tree Zigzag Level Order Traversal
复杂度
时间O(n) 空间 O(n)
代码
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (root == null) {
return res;
}
boolean flag = true;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<Integer> tem = new ArrayList<Integer>();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
if (flag) {
tem.add(node.val);
} else {
tem.add(0,node.val);
}
}
flag = !flag;
res.add(tem);
}
return res;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。