二叉樹(shù)先序,中序和后序遍歷的遞歸和非遞歸實(shí)現(xiàn)

遞歸

比較簡(jiǎn)單,直接看代碼即可.


    private void preOrderRec(TreeNode node,ArrayList<Integer> pre){
        if(node==null) return;
        pre.add(node.val);
        preOrderRec(node.left,pre);
        preOrderRec(node.right,pre);
    }
    
    private void inOrderRec(TreeNode node,ArrayList<Integer> in){
        if(node==null) return;        
        inOrderRec(node.left,in);
        in.add(node.val);
        inOrderRec(node.right,in);
    }
    
    private void postOrderRec(TreeNode node,ArrayList<Integer> post){
        if(node==null) return; 
        postOrderRec(node.left,post);
        postOrderRec(node.right,post);
        post.add(node.val);
    }

非遞歸

先序遍歷

  1. 申請(qǐng)一個(gè)棧,記為s1,將頭結(jié)點(diǎn)壓棧.
  2. 每次從棧頂彈出節(jié)點(diǎn)node,打印node的值,如果node的右子節(jié)點(diǎn)不為空,壓棧.如果node的左子結(jié)點(diǎn)不為空,壓棧.
  3. 重復(fù)步驟2直到棧為空.
//非遞歸版本
    private void preOrder(TreeNode node,ArrayList<Integer> pre){      
       Deque<TreeNode> stack=new ArrayDeque<TreeNode>();
       if(node==null) return;
       stack.push(node);
       while(!stack.isEmpty()){
           node=stack.pop();
           pre.add(node.val);
           if(node.right!=null)stack.push(node.right);
           if(node.left!=null)stack.push(node.left);           
       }
    }

中序遍歷

  1. 申請(qǐng)一個(gè)棧,記為s1,當(dāng)前節(jié)點(diǎn)為node.
  2. 將node及其左邊界壓入棧中,即不斷的利用node=node.left并對(duì)其壓棧,然后重復(fù)步驟2.
  3. 直到node為空,此時(shí)從s1中彈出一個(gè)節(jié)點(diǎn),記為node,打印node的值并讓node=node.right.轉(zhuǎn)到步驟2.
 private void inOrder(TreeNode node,ArrayList<Integer> in){
        Deque<TreeNode> stack=new ArrayDeque<TreeNode>();
        while(node!=null||!stack.isEmpty()){    
           while(node!=null){
               stack.push(node);
               node=node.left;
           }      
           node=stack.pop();
           in.add(node.val);
           node=node.right;                       
       }        
    }

后序遍歷(兩個(gè)棧實(shí)現(xiàn))

  1. 申請(qǐng)一個(gè)棧,記為s1,然后將頭結(jié)點(diǎn)壓入s1.
  2. 從s1中彈出的節(jié)點(diǎn)記為node,先把node的左孩子壓入s1中,再把node的右孩子壓入s1中.
  3. 在整個(gè)過(guò)程過(guò)程中,每個(gè)從s1中彈出的節(jié)點(diǎn)都?jí)喝氲絪2中.
  4. 不斷重復(fù)2和3,直到s1為空.
  5. 依次彈出s2的值就是后序遍歷的結(jié)果.
 private void postOrder(TreeNode node,ArrayList<Integer> post){
       Deque<TreeNode> stack1=new ArrayDeque<TreeNode>();
       Deque<TreeNode> stack2=new ArrayDeque<TreeNode>();
       if(node==null)return;
       stack1.push(node);
       while(!stack1.isEmpty()){
           node=stack1.pop();
           stack2.push(node);
           if(node.left!=null)stack1.push(node.left);
           if(node.right!=null)stack1.push(node.right);        
       }
       while(!stack2.isEmpty()){
           post.add(stack2.pop().val);
       }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末屋确,一起剝皮案震驚了整個(gè)濱河市公壤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膳叨,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡基协,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)谷丸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)堡掏,“玉大人,你說(shuō)我怎么就攤上這事刨疼。” “怎么了鹅龄?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵揩慕,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我扮休,道長(zhǎng)迎卤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任玷坠,我火速辦了婚禮蜗搔,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘八堡。我一直安慰自己樟凄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布兄渺。 她就那樣靜靜地躺著缝龄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪挂谍。 梳的紋絲不亂的頭發(fā)上叔壤,一...
    開(kāi)封第一講書(shū)人閱讀 52,457評(píng)論 1 311
  • 那天,我揣著相機(jī)與錄音口叙,去河邊找鬼炼绘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛妄田,可吹牛的內(nèi)容都是我干的俺亮。 我是一名探鬼主播驮捍,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼铅辞!你這毒婦竟也來(lái)了厌漂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤斟珊,失蹤者是張志新(化名)和其女友劉穎苇倡,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體囤踩,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旨椒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堵漱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片综慎。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勤庐,靈堂內(nèi)的尸體忽然破棺而出示惊,到底是詐尸還是另有隱情,我是刑警寧澤愉镰,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布米罚,位于F島的核電站,受9級(jí)特大地震影響丈探,放射性物質(zhì)發(fā)生泄漏录择。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一碗降、第九天 我趴在偏房一處隱蔽的房頂上張望隘竭。 院中可真熱鬧,春花似錦讼渊、人聲如沸动看。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)弧圆。三九已至,卻和暖如春笔咽,著一層夾襖步出監(jiān)牢的瞬間搔预,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工叶组, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拯田,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓甩十,卻偏偏與公主長(zhǎng)得像船庇,于是被迫代替她去往敵國(guó)和親吭产。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容