【复习笔记】二叉树的前中后非递归遍历算法

来源:互联网 发布:360浏览器 淘宝比价 编辑:程序博客网 时间:2024/05/29 15:11

前序遍历

思路:全局指针,指向根节点,所到节点立即访问,然后把节点入栈,往左走。

当左子树为空时,pop栈顶节点,如果栈顶右子树不空,把全局指针往右走,继续循环。

循环结束条件:栈为空并且全局指针为null时。

public static void preIte(TreeNode root){Stack<TreeNode> stack = new Stack<TreeNode>();TreeNode temp = root;while(!stack.isEmpty() || temp != null){if(temp != null){System.out.println(temp.val);stack.add(temp);temp = temp.left;}else{temp = stack.pop();temp = temp.right;}}}

中序遍历

思路:全局指针,初始指向根节点,循环入栈,直到全局指针的左子树为空。

pop栈顶节点并访问,如果栈顶节点的右子树不为空,则全局指针往右走,继续循环。

循环结束条件:栈空或者全局指针为null时。

public static void midIte(TreeNode root){Stack<TreeNode> stack = new Stack<TreeNode>();TreeNode temp = root;while(temp != null || !stack.isEmpty()){while(temp != null){stack.add(temp);temp = temp.left;}if(!stack.isEmpty()){temp = stack.pop();System.out.println(temp.val);temp = temp.right;}}}

后序遍历

思路:全局指针+上一次遍历节点的指针,首先根节点入栈。

如果全局指针现在指向的节点没有左右孩子 或者 全局指针指向的节点的左孩子或者右孩子是上一次遍历的节点,则

遍历当前节点,并出栈,同时上一次遍历的节点指向此节点。否则,当前节点的右孩子若不为空,右孩子入栈,当前节点的左孩子不为空,左孩子入栈。

循环结束条件:栈空。

public static void postIte(TreeNode root){Stack<TreeNode> stack = new Stack<TreeNode>();TreeNode temp = root;TreeNode preNode = null;if(temp != null) stack.add(temp);while(!stack.isEmpty()){temp = stack.peek();if((temp.right == null && temp.left == null) ||(preNode != null && (temp.left == preNode || temp.right == preNode))){System.out.println(temp.val);stack.pop();preNode = temp;}else{if(temp.right != null)stack.add(temp.right);if(temp.left != null)stack.add(temp.left);}}}


原创粉丝点击