二叉树的递归遍历
二叉树的前中后序遍历,是对中间节点而言的。
public static void pretraversal(TreeNode tree) {
if(tree==null) return;
System.out.print(tree.val+",");
pretraversal(tree.left);
pretraversal(tree.right);
}
public static void intraversal(TreeNode tree) {
if(tree==null) return;
intraversal(tree.left);
System.out.print(tree.val+",");
intraversal(tree.right);
}
public static void posttraversal(TreeNode tree) {
if(tree==null) return;
posttraversal(tree.left);
posttraversal(tree.right);
System.out.print(tree.val+",");
}
二叉树的迭代遍历
前序遍历:使用栈存储二叉树节点,按中间->右子树->左子树的顺序存储,出来的顺序就是中间->左子树->右子树,即前序遍历的顺序。
中序遍历:利用treenode节点访问节点,栈记录访问过的节点并处理节点。
后序遍历:使用栈存储二叉树节点,按中间->左子树->右子树的顺序存储,出来的顺序就是中间->右子树->左子树,反转一下就是左子树->右子树->中间,即后序遍历的顺序。
public static void pretraversal2(TreeNode tree) {
if(tree==null) return;
Stack<TreeNode> stack=new Stack<>();
stack.add(tree);
while(!stack.isEmpty()) {
TreeNode cur=stack.pop();
System.out.print(cur.val+",");
if(cur.right!=null) stack.add(cur.right);
if(cur.left!=null) stack.add(cur.left);
}
}
public static void intraversal2(TreeNode tree) {
TreeNode cur=tree;
Stack<TreeNode> stack=new Stack<>();
while(!stack.isEmpty()||cur!=null) {
if(cur!=null) {
stack.add(cur);
cur=cur.left;
}else {
cur=stack.pop();
System.out.print(cur.val+",");
cur=cur.right;
}
}
}
public static void posttraversal2(TreeNode tree) {
if(tree==null) return;
ArrayList<Integer>list=new ArrayList<>();
Stack<TreeNode> stack=new Stack<>();
stack.add(tree);
while(!stack.isEmpty()) {
TreeNode cur=stack.pop();
list.add(cur.val);
if(cur.left!=null) stack.push(cur.left);
if(cur.right!=null) stack.push(cur.right);
}
for(int i=list.size()-1;i>=0;i--) {
System.out.print(list.get(i)+",");
}
System.out.println();
}