二叉树三种遍历的顺序:
前序:根–>左–>右
中序:左–>根–>右
后序:左–>右–>根
算法基于此顺序开始编写
前序: 取节点值–>让左子树一直入栈–>出栈,取右子树
public List<Integer> preOrder(TreeNode root){
List<Integer> list=new ArrayList<>();
Stack<TreeNode> stack=new Stack<>();
while(root!=null||!stack.isEmpty()){
while(root!=null){
list.add(root.val);
stack.push(root);
root=root.left;
}
root=stack.pop();
root=root.right;
}
return list;
}
中序: 让左子树一直入栈 -->出栈取左子树值–>取右子树
public List<Integer> inOrder(TreeNode root){
List<Integer> list=new ArrayList<>();
Stack<TreeNode> stack=new Stack<>();
while(root!=null||!stack.isEmpty()){
while(root!=null){
stack.push(root);
root=root.left;
}
root=stack.pop();
list.add(root.val);
root=root.right;
}
return list;
}
后序:让左子树一直入栈 --> 取顶层节点进行判断:
右子树为空–>取值
不为空–>指向右子树
public List<Integer> postOrder(TreeNode root) {
List<Integer> list=new ArrayList<>();
Stack<TreeNode> stack=new Stack<>();
TreeNode pre=null;
while(root!=null||!stack.isEmpty()){
while(root!=null){
stack.push(root);
root=root.left;
}
root=stack.peek();
if(root.right==null || root.right==pre){
list.add(root.val);
stack.pop();
pre=root;
root=null;
}else{
root=root.right;
}
}
return list;
}