二叉树的三种非递归遍历方式

x33g5p2x  于2021-11-09 转载在 其他  
字(1.5k)|赞(0)|评价(0)|浏览(373)

前言:
在之前,我们写到了二叉树的递归 先、中、后序的遍历方式,今天,来讨论这三种遍历方式的非递归实现!!

先序遍历

思路: 类似于层序遍历

  • 创建一个栈,先把根节点入栈
  • 循环取栈顶元素,并访问(打印)
  • 把当前节点的左 / 右子树分别入栈
  • 当栈为空时,遍历结束

代码实现:

  1. public List<Integer> preorderTraversal(Node root) {
  2. List<Integer> result = new ArrayList<>();
  3. // 空树判断
  4. if(root == null){
  5. return result;
  6. }
  7. // 创建一个栈
  8. Stack<Node> stack = new Stack<>();
  9. Node cur = root;
  10. while(!stack.isEmpty() || cur != null){
  11. while(cur != null){
  12. result.add(cur.val);
  13. stack.push(cur);
  14. cur = cur.left;
  15. }
  16. cur = stack.pop();
  17. cur = cur.right;
  18. }
  19. return result;
  20. }

中序遍历

思路:
仍然先要创建一个栈,创建一个 cur ,从根节点出发,循环往左找,一直找到 null 为止,路径上遇到的节点都入栈
遇到 null 的时候,就取栈顶元素,并访问(打印)
再让 cur 从当前栈顶元素的右子树出发,循环刚才的过程

代码实现:

  1. public List<Integer> inorderTraversal(Node root) {
  2. //创建一个List
  3. List<Integer> result = new ArrayList<>();
  4. //空树判断
  5. if(root == null){
  6. return result;
  7. }
  8. Stack<Node> stack = new Stack<>();
  9. Node cur = root;
  10. while(!stack.isEmpty() || cur != null){
  11. while(cur != null){
  12. stack.push(cur);
  13. cur = cur.left;
  14. }
  15. cur = stack.pop();
  16. result.add(cur.val);
  17. cur = cur.right;
  18. }
  19. return result;
  20. }

后序遍历

思路: 和中序遍历很像
先创建一个栈,创建一个 cur,从根节点出发,循环往左找,一直找到 null 为止,路径上遇到的节点都入栈,(此时还不能访问,若栈顶元素的右子树为 null,或右子树已经被访问过了,才能访问栈顶元素)

右子树是否已经访问:使用一个 prev 记录下后序遍历过程中最后一个被访问到的元素

代码实现:

  1. public List<Integer> postorderTraversal(Node root) {
  2. //创建一个List
  3. List<Integer> result = new ArrayList<>();
  4. //空树判断
  5. if(root == null){
  6. return result;
  7. }
  8. Stack<Node> stack = new Stack<>();
  9. Node cur = root;
  10. Node prev = null;
  11. while(cur != null || !stack.isEmpty()){
  12. while(cur != null){
  13. stack.push(cur);
  14. cur = cur.left;
  15. }
  16. cur = stack.pop();
  17. if(cur.right == null || cur.right == prev){
  18. result.add(cur.val);
  19. prev = cur;
  20. cur = null;
  21. }
  22. else {
  23. stack.push(cur);
  24. cur = cur.right;
  25. }
  26. }
  27. return result;
  28. }

相关文章