樹的三種遍歷

import java.util.Stack;

public class BinaryTree {
    private class Node {
        int val;
        Node left;
        Node right;
        Node(int val) {
            this.val = val;
            this.left = null;
            this.right = null;
        }
    }

    public Node root;

    public Node creatTree() {
        root = new Node(1);
        Node node2 = new Node(2);
        Node node3 = new Node(3);
        Node node4 = new Node(4);
        Node node5 = new Node(5);
        Node node6 = new Node(6);
        Node node7 = new Node(7);
        root.left = node2;
        root.right = node3;
        node2.left = node4;
        node2.right = node5;
        node3.left = node6;
        node3.right = node7;
        node4.left = new Node(8);
        node4.right = new Node(9);
        node6.right = new Node(10);
        node7.left = new Node(11);
        return root;
    }

    public void visit(Node node) {
        if (node == null) return;
        System.out.print(node.val + " ");
    }
    
    // 遞歸前序
    public void preOrder(Node node) {
        if (node == null) return;
        visit(node);
        preOrder(node.left);
        preOrder(node.right);
    }

    // 遞歸中序
    public void inOrder(Node node) {
        if (node == null) return;
        inOrder(node.left);
        visit(node);
        inOrder(node.right);
    }

    // 遞歸后序
    public void postOrder(Node node) {
        if (node == null) return;
        postOrder(node.left);
        postOrder(node.right);
        visit(node);
    }

    // 非遞歸前序
    public void iterPreOrder (Node node) {
        Stack<Node> stack = new Stack<>();
        Node p = node;
        while (p != null || !stack.empty()) {
            // 壓棧到左子樹的最左節(jié)點(diǎn)
            while (p != null) {
                visit(p);       // 在push之前就訪問,其實(shí)是第一次遇到該節(jié)點(diǎn)就訪問
                stack.push(p);
                p = p.left;
            }
            if (!stack.empty()) {
                p = stack.pop();
                p = p.right;
            }
        }
    }

    // 非遞歸中序
    public void iterInOrder (Node node) {
        Stack<Node> stack = new Stack<>();
        Node p = node;
        while (p != null || !stack.empty()) {
            // 壓棧到左子樹的最左節(jié)點(diǎn)
            while (p != null) {
                stack.push(p);
                p = p.left;
            }
            if (!stack.empty()) {
                p = stack.pop();
                visit(p);       // 中序和前序非遞歸僅這一句的位置不同,在pop之后訪問,其實(shí)為第二次遇到時(shí)訪問
                p = p.right;
            }
        }
    }

    // 非遞歸后序
    public void iterPostOrder (Node node) {
        Stack<Node> stack = new Stack<>();
        // 后續(xù)為先左右,后自己豆村。前序和中序的push和pop其實(shí)可以看做是兩次路過該節(jié)點(diǎn)
        // 而后續(xù)為第三次,即經(jīng)過該節(jié)點(diǎn)到左節(jié)點(diǎn),然后再從左節(jié)點(diǎn)經(jīng)過該節(jié)點(diǎn)到右節(jié)點(diǎn)立膛,之后才是節(jié)點(diǎn)自身
        // 故我們這里設(shè)置一個(gè)last變量,來記錄梯码,是否訪問過該節(jié)點(diǎn)的右節(jié)點(diǎn)
        Node curr = node;
        Node last = null;
        // 壓棧到左子樹的最左節(jié)點(diǎn)
        while (curr != null) {
            stack.push(curr);
            curr = curr.left;
        }
        while (!stack.empty()) {
            curr = stack.pop();
            // 沒有右子樹或右子樹訪問過時(shí)宝泵,才可以訪問該節(jié)點(diǎn)
            if (curr.right == null || curr.right == last) {
                visit(curr);
                last = curr;
            } else {
                stack.push(curr);
                curr = curr.right;
                while (curr != null) {
                    stack.push(curr);
                    curr = curr.left;
                }
            }
        }
    }

    public static void main(String[] args) {
        BinaryTree tree = new BinaryTree();
        Node root = tree.creatTree();
        tree.iterPreOrder(root);
        System.out.println();
        tree.iterInOrder(root);
        System.out.println();
        tree.iterPostOrder(root);
        System.out.println();
        tree.preOrder(root);
        System.out.println();
        tree.inOrder(root);
        System.out.println();
        tree.postOrder(root);
        System.out.println();

    }
}

輸出:

1 2 4 8 9 5 3 6 10 7 11 
8 4 9 2 5 1 6 10 3 11 7 
8 9 4 5 2 10 6 11 7 3 1 
1 2 4 8 9 5 3 6 10 7 11 
8 4 9 2 5 1 6 10 3 11 7 
8 9 4 5 2 10 6 11 7 3 1
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市轩娶,隨后出現(xiàn)的幾起案子儿奶,更是在濱河造成了極大的恐慌,老刑警劉巖鳄抒,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件闯捎,死亡現(xiàn)場離奇詭異椰弊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瓤鼻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門秉版,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人娱仔,你說我怎么就攤上這事沐飘。” “怎么了牲迫?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵耐朴,是天一觀的道長。 經(jīng)常有香客問我盹憎,道長筛峭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任陪每,我火速辦了婚禮影晓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘檩禾。我一直安慰自己挂签,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布盼产。 她就那樣靜靜地躺著饵婆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪戏售。 梳的紋絲不亂的頭發(fā)上侨核,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音灌灾,去河邊找鬼搓译。 笑死,一個(gè)胖子當(dāng)著我的面吹牛锋喜,可吹牛的內(nèi)容都是我干的些己。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼嘿般,長吁一口氣:“原來是場噩夢啊……” “哼轴总!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起博个,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎功偿,沒想到半個(gè)月后盆佣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體往堡,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年共耍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了虑灰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡痹兜,死狀恐怖穆咐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情字旭,我是刑警寧澤对湃,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站遗淳,受9級特大地震影響拍柒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜屈暗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一拆讯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧养叛,春花似錦种呐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至潘飘,卻和暖如春肮之,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卜录。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工戈擒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人艰毒。 一個(gè)月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓筐高,卻偏偏與公主長得像,于是被迫代替她去往敵國和親丑瞧。 傳聞我的和親對象是個(gè)殘疾皇子柑土,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359

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