欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java非遞歸實現(xiàn)之二叉樹的前中后序遍歷詳解

 更新時間:2021年09月16日 10:44:45   作者:小玄ks  
樹的遍歷順序大體分為三種:前序遍歷(先根遍歷、先序遍歷),中序遍歷(中根遍歷),后序遍歷(后根遍歷),本文將給大家詳細的介紹,對大家的學習或工作具有一定的參考借鑒價值

二叉樹的前中后序遍歷

核心思想:用棧來實現(xiàn)對節(jié)點的存儲。一邊遍歷,一邊將節(jié)點入棧,在需要時將節(jié)點從棧中取出來并遍歷該節(jié)點的左子樹或者右子樹,重復上述過程,當棧為空時,遍歷完成。

前序遍歷

//非遞歸
//根 左 右
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        //用數(shù)組來存儲前序遍歷結果
        List<Integer> list = new ArrayList<>();
        if(root==null)  return list;
        
        //創(chuàng)建一個棧
        Stack<TreeNode> st = new Stack<>();
        //cur指向根節(jié)點
        TreeNode cur = root;
        
        while(!st.isEmpty()||cur!=null){
        
            //一邊向左遍歷,一邊將遍歷到的節(jié)點入棧,節(jié)點值入數(shù)組
            while(cur!=null){
                list.add(cur.val);
                st.push(cur);	//根
                cur=cur.left;	//左
            }
            
            //指針指向棧頂節(jié)點(即上一個節(jié)點),并將棧頂節(jié)點出棧
            cur = st.pop();
            //指針指向該節(jié)點的右子樹,開始下一輪的遍歷
            cur = cur.right;	//右
        }
        return list;
    }
}

中序遍歷

//非遞歸
//左 根 右
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){
      //一邊向左遍歷,一邊將遍歷到的節(jié)點入棧
          while(cur!=null){
              st.push(cur);
              cur = cur.left;	//左
          }
          cur = st.pop();
          //存儲遍歷結果
          list.add(cur.val);	//根
          cur = cur.right;		//右
      }
      return list;
    }
}

前序遍歷和中序遍歷的代碼基本相同,但是后序遍歷與它們不太一樣

后序遍歷

//非遞歸
//左 右 根
class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
     List<Integer> list = new ArrayList<>();
     if(root==null) return list;
     TreeNode cur = root;
     
     //關鍵在于定義一個cur的前驅節(jié)點
     TreeNode pre = null;
     Stack<TreeNode> st = new Stack<>();
     while(cur!=null||!st.isEmpty()){
     
     	//一邊向左遍歷,一邊將遍歷到的節(jié)點入棧
         while(cur!=null){
             st.push(cur);
            cur = cur.left;
         }
         cur = st.pop();
         //若該節(jié)點的右節(jié)點為空,或者右節(jié)點被遍歷過,數(shù)組才能存儲該節(jié)點的數(shù)值(也就是我們最后才遍歷的根)
         if(cur.right==null||cur.right==pre){
             list.add(cur.val);
             pre = cur;
             cur=null;
         }else{//如果不滿足,說明該節(jié)點的右節(jié)點還沒有被遍歷過,那么接著向右子節(jié)點遍歷
             st.push(cur);
             cur=cur.right;
         }
     }
     return list;
    }
}

到此這篇關于java非遞歸實現(xiàn)之二叉樹的前中后序遍歷詳解的文章就介紹到這了,更多相關Java 二叉樹遍歷內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

最新評論