二叉树的前序遍历(递归版):
public ArrayList<Integer> inOrder(TreeNode root ){
ArrayList<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
result.add(root.val);
inOrder(root.left);+
inOrder(root.right);
return result;
}
二叉树的中序遍历(递归版):
public ArrayList<Integer> inOrder(TreeNode root ){
ArrayList<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
inOrder(root.left);
result.add(root.val);
inOrder(root.right);
return result;
}
二叉树的后续遍历(递归版):
public ArrayList<Integer> inOrder(TreeNode root ){
ArrayList<Integer> result = new ArrayList<Integer>();
if(root == null){
return result;
}
inOrder(root.left);
inOrder(root.right);
result.add(root.val);
return result;
}
递归版总结:
其实就是添加节点的地方不同
前序遍历:添加节点就是在递归之前添加;
中序遍历:添加节点在左右节点递归之间;
后序遍历:添加节点是在左右节点递归之后;
二叉树的前序遍历(迭代版):
public ArrayList<Integer> preOrder(TreeNode root){ ArrayList<Integer> result= new ArrayList<Integer>(); Stack<TreeNode> stack = new Stack<TreeNode>(); if(root == null){ return result; } if(root != null){ stack.push(root); result.add(root.val); root=root.left; }else{ root=stack.pop(); root=root.right; } return result;}
二叉树中序遍历(迭代版):
public ArrayList<Integer> inOrder(TreeNode root){
ArrayList<Integer> result = new ArrayList<Integer>();
Stack<TreeNode> stack = new Stack<TreeNode>();
if(root == null){
return result;
}
while(root != null || !stack.isEmpty()){
if(root != null){
stack.push(root);
root=root.left;
}else{
root= stack.pop();
result.add(root.val);
root= root.right;
}
}
return result;
}
二叉树后序遍历(迭代版):
最开始以为他很难,当你理解前两个之后,就会发现他跟前序遍历很像!
public ArrayList<Integer> postTreeNode(TreeNode root){
Stack<TreeNode> midstack = new Stack<TreeNode>();
Stack<TreeNode> resultstack= new Stack<TreeNode>() ;
ArrayList<Integer> result = new ArrayList<Integer>();
while(root != null || !midstack.isEmpty()){
if(root != null){
midstack.push(root);
resultstack.push(root);
root=root.right;
}else{
root=midstack.pop();
root=root.left;
}
}
while(resultstack.size() > 0){
TreeNode temp = resultstack.pop();
result.add(temp.val);
}
return result;
}