中序遍歷--遞歸和非遞歸(java版)

根據(jù)中序遍歷的順序,對(duì)于任一結(jié)點(diǎn)昌罩,優(yōu)先訪問(wèn)其左孩子,而左孩子結(jié)點(diǎn)又可以看做一根結(jié)點(diǎn)灾馒,然后繼續(xù)訪問(wèn)其左孩子結(jié)點(diǎn)茎用,直到遇到左孩子結(jié)點(diǎn)為空的結(jié)點(diǎn)才進(jìn)行訪問(wèn),然后按相同的規(guī)則訪問(wèn)其右子樹(shù)。因此其處理過(guò)程如下:

對(duì)于任一結(jié)點(diǎn)root绘搞,引入一個(gè)輔助節(jié)點(diǎn)p彤避,其作用是:標(biāo)記已經(jīng)訪問(wèn)過(guò)的節(jié)點(diǎn),

1)將root壓入棧中夯辖,只有有左孩子琉预,就壓入棧中

  if(p!=null &&  p.left!=null) {
                stk.add(p.left);
                p = p.left;
            }

2)對(duì)棧頂元素 q 進(jìn)行出棧操作,訪問(wèn)該棧頂結(jié)點(diǎn)蒿褂。

如果 q 沒(méi)有右孩子圆米,將輔助節(jié)點(diǎn) p 設(shè)置為null。表示下一步還是進(jìn)行2)操作啄栓,出棧操作

如果 q 有右孩子娄帖,將右孩子壓棧中,p = q的右孩子

     p = stk.pop();//彈出棧頂節(jié)點(diǎn)  左孩子--->根節(jié)點(diǎn)
                System.out.print(p.val+" ");//訪問(wèn)
                if(p!=null && p.right!=null) {//如果棧點(diǎn)元素有右孩子的話昙楚,將有節(jié)點(diǎn)壓入棧中
                    stk.add(p.right);
                    p = p.right;
                }else
                    p = null;//p=stk.pop;已經(jīng)訪問(wèn)過(guò)p了近速,p設(shè)置為null

3)直到棧為空,遍歷結(jié)束堪旧。

代碼重點(diǎn)是削葱,2先訪問(wèn)出棧,然后將5節(jié)點(diǎn)呀入棧中

import java.util.Stack;
class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}
public class Main {
    //中序遍歷 遞歸算法
    public static void InOrder(TreeNode root) {
        if(root==null)return;
        InOrder(root.left);
        System.out.print(root.val+" ");
        InOrder(root.right);
    }
    // 中序遍歷 非遞歸算法
    public static void InOrder2(TreeNode root) {
        if(root==null)return;
        Stack<TreeNode> stk = new Stack<TreeNode>();
        TreeNode p = root;//輔助節(jié)點(diǎn)
        stk.add(p);
        while(stk.isEmpty() == false) {
            //只要你有左孩子淳梦,就將左孩子壓入棧中
            if(p!=null &&  p.left!=null) {
                stk.add(p.left);
                p = p.left;
            }else {
                p = stk.pop();//彈出棧頂節(jié)點(diǎn)  左孩子--->根節(jié)點(diǎn)
                System.out.print(p.val+" ");//訪問(wèn)
                if(p!=null && p.right!=null) {//如果棧點(diǎn)元素有右孩子的話析砸,將有節(jié)點(diǎn)壓入棧中
                    stk.add(p.right);
                    p = p.right;
                }else
                    p = null;//p=stk.pop;已經(jīng)訪問(wèn)過(guò)p了,p設(shè)置為null
            }
        }
    }
    public static void main(String[] args) {
        TreeNode root = new TreeNode(1);
         root.left = new TreeNode(2);
         root.right = new TreeNode(3);
         
         root.left.left = new TreeNode(4);
         root.left.right = new TreeNode(5);
 
         root.right.left = new TreeNode(6);
         root.right.right = new TreeNode(7);    
         
         InOrder2(root);
    }
 
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末爆袍,一起剝皮案震驚了整個(gè)濱河市首繁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陨囊,老刑警劉巖弦疮,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異谆扎,居然都是意外死亡挂捅,警方通過(guò)查閱死者的電腦和手機(jī)芹助,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)堂湖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人状土,你說(shuō)我怎么就攤上這事无蜂。” “怎么了蒙谓?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵斥季,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)酣倾,這世上最難降的妖魔是什么舵揭? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮躁锡,結(jié)果婚禮上午绳,老公的妹妹穿的比我還像新娘。我一直安慰自己映之,他們只是感情好拦焚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著杠输,像睡著了一般赎败。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蠢甲,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天僵刮,我揣著相機(jī)與錄音,去河邊找鬼鹦牛。 笑死妓笙,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的能岩。 我是一名探鬼主播寞宫,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼拉鹃!你這毒婦竟也來(lái)了辈赋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤膏燕,失蹤者是張志新(化名)和其女友劉穎钥屈,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體坝辫,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡篷就,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了近忙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竭业。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖及舍,靈堂內(nèi)的尸體忽然破棺而出未辆,到底是詐尸還是另有隱情,我是刑警寧澤锯玛,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布咐柜,位于F島的核電站兼蜈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拙友。R本人自食惡果不足惜为狸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望遗契。 院中可真熱鬧钥平,春花似錦、人聲如沸姊途。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)捷兰。三九已至立叛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贡茅,已是汗流浹背秘蛇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顶考,地道東北人赁还。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像驹沿,于是被迫代替她去往敵國(guó)和親艘策。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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