二叉树的定义:
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
1、先序遍历 preorder traversal
递归实现:
public class Solution {
private ArrayList<Integer> arr = new ArrayList<Integer>();
public ArrayList<Integer> preorderTraversal(TreeNode root) {
if(root == null) return arr;
arr.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
return arr;
}
}
非递归实现:
public class Solution {
private ArrayList<Integer> arr = new ArrayList<Integer>();
public ArrayList<Integer> preorderTraversal(TreeNode root) {
if(root == null) return arr;
// arr.add(root.val);
// preorderTraversal(root.left);
// preorderTraversal(root.right);
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.empty()) {
TreeNode p = stack.peek();
while(p != null) {
arr.add(p.val);
stack.push(p.left);
p = stack.peek();
}
stack.pop();
if(!stack.empty()) {
p = stack.pop();
stack.push(p.right);
}
}
return arr;
}
}
2、中序遍历 inorder traversal
递归实现:
public class Solution {
private ArrayList<Integer> arr = new ArrayList<Integer>();
public ArrayList<Integer> inorderTraversal(TreeNode root) {
if(root == null) return arr;
if(root.left != null)
inorderTraversal(root.left);
arr.add(root.val);
if(root.right != null)
inorderTraversal(root.right);
return arr;
}
}
非递归实现:
public class Solution {
private ArrayList<Integer> arr = new ArrayList<Integer>();
public ArrayList<Integer> inorderTraversal(TreeNode root) {
if(root == null) return arr;
// if(root.left != null)
// inorderTraversal(root.left);
// arr.add(root.val);
// if(root.right != null)
// inorderTraversal(root.right);
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
while(!stack.empty()) {
TreeNode p = stack.peek();
while(p != null) {
stack.push(p.left);
p = stack.peek();
}
stack.pop(); // pop the empty point
if(!stack.empty()) {
p = stack.pop();
arr.add(p.val);
stack.push(p.right);
}
}
return arr;
}
}
3、后序遍历 postorder traversal
递归实现:
public class Solution {
private ArrayList<Integer> arr = new ArrayList<Integer>();
public ArrayList<Integer> postorderTraversal(TreeNode root) {
if(root == null) return arr;
if(root.left != null) postorderTraversal(root.left);
if(root.right != null) postorderTraversal(root.right);
arr.add(root.val);
return arr;
}
}
非递归实现:
后续遍历的非递归实现较先序和中序有大不同,因为此时除叶子节点外的每个节点都会被访问到两次。本方法采用的是:如果左右孩子都为空,则访问该节点;或者当前节点的左右孩子都已经被访问过,则访问该节点,并弹出栈。入栈时,若有右孩子,则右孩子先进栈,然后左孩子进栈,这样是为了保证出栈时先访问左孩子。
public class Solution {
private ArrayList<Integer> arr = new ArrayList<Integer>();
public ArrayList<Integer> postorderTraversal(TreeNode root) {
if(root == null) return arr;
// if(root.left != null) postorderTraversal(root.left);
// if(root.right != null) postorderTraversal(root.right);
// arr.add(root.val);
Stack<TreeNode> stack = new Stack<TreeNode>();
stack.push(root);
TreeNode pre = null;
while(!stack.empty()) {
TreeNode p = stack.peek();
// left and right child are null, visit present node
// previous visited node is present node's left or right child, visit present node
if((p.left == null && p.right == null) ||
(pre != null && (pre == p.left || pre == p.right))) {
arr.add(p.val);
stack.pop();
pre = p;
}
else {
// first push the right child, then push the left child
// to ensure first visit the left child
if(p.right != null) stack.push(p.right);
if(p.left != null) stack.push(p.left);
}
}
return arr;
}
}