gpt4 book ai didi

java非递归实现之二叉树的前中后序遍历详解

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 32 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章java非递归实现之二叉树的前中后序遍历详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

二叉树的前中后序遍历

核心思想:用栈来实现对节点的存储。一边遍历,一边将节点入栈,在需要时将节点从栈中取出来并遍历该节点的左子树或者右子树,重复上述过程,当栈为空时,遍历完成.

前序遍历

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//非递归
//根 左 右
class Solution {
     public List<Integer> preorderTraversal(TreeNode root) {
         //用数组来存储前序遍历结果
         List<Integer> list = new ArrayList<>();
         if (root== null return list;
        
         //创建一个栈
         Stack<TreeNode> st = new Stack<>();
         //cur指向根节点
         TreeNode cur = root;
        
         while (!st.isEmpty()||cur!= null ){
        
             //一边向左遍历,一边将遍历到的节点入栈,节点值入数组
             while (cur!= null ){
                 list.add(cur.val);
                 st.push(cur);   //根
                 cur=cur.left;   //左
             }
            
             //指针指向栈顶节点(即上一个节点),并将栈顶节点出栈
             cur = st.pop();
             //指针指向该节点的右子树,开始下一轮的遍历
             cur = cur.right;    //右
         }
         return list;
     }
}

中序遍历

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//非递归
//左 根 右
class Solution {
     public List<Integer> inorderTraversal(TreeNode root) {
        
       List<Integer> list = new ArrayList<>();
       if (root== null )    return list;
        
       Stack<TreeNode> st = new Stack<>();
        TreeNode cur = root;
       while (!st.isEmpty()||cur!= null ){
       //一边向左遍历,一边将遍历到的节点入栈
           while (cur!= null ){
               st.push(cur);
               cur = cur.left;   //左
           }
           cur = st.pop();
           //存储遍历结果
           list.add(cur.val);    //根
           cur = cur.right;      //右
       }
       return list;
     }
}

前序遍历和中序遍历的代码基本相同,但是后序遍历与它们不太一样 。

后序遍历

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//非递归
//左 右 根
class Solution {
     public List<Integer> postorderTraversal(TreeNode root) {
      List<Integer> list = new ArrayList<>();
      if (root== null ) return list;
      TreeNode cur = root;
     
      //关键在于定义一个cur的前驱节点
      TreeNode pre = null ;
      Stack<TreeNode> st = new Stack<>();
      while (cur!= null ||!st.isEmpty()){
     
         //一边向左遍历,一边将遍历到的节点入栈
          while (cur!= null ){
              st.push(cur);
             cur = cur.left;
          }
          cur = st.pop();
          //若该节点的右节点为空,或者右节点被遍历过,数组才能存储该节点的数值(也就是我们最后才遍历的根)
          if (cur.right== null ||cur.right==pre){
              list.add(cur.val);
              pre = cur;
              cur= null ;
          } else { //如果不满足,说明该节点的右节点还没有被遍历过,那么接着向右子节点遍历
              st.push(cur);
              cur=cur.right;
          }
      }
      return list;
     }
}

到此这篇关于java非递归实现之二叉树的前中后序遍历详解的文章就介绍到这了,更多相关Java 二叉树遍历内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://blog.csdn.net/m0_52373742/article/details/120316956 。

最后此篇关于java非递归实现之二叉树的前中后序遍历详解的文章就讲到这里了,如果你想了解更多关于java非递归实现之二叉树的前中后序遍历详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com