【我是一棵樹】二叉樹詳解(二)

二叉樹的存儲結(jié)構(gòu)

順序存儲:就是用一組數(shù)組來存儲二叉樹中節(jié)點,并且節(jié)點的存儲位置绪撵,也就是數(shù)組的下標(biāo)要能體現(xiàn)節(jié)點之間的邏輯關(guān)系姆蘸。

考慮一種極端情況,一棵深度為k的右斜數(shù)翅敌,它只有k個節(jié)點羞福,卻需要分配2^k-1個存儲單元,這顯然是對空間的浪費蚯涮,所以順序的存儲結(jié)構(gòu)只適用于完全二叉樹治专。

二叉鏈表:既然順序存儲結(jié)構(gòu)實用性不強(qiáng),我們就要考慮練市存儲結(jié)構(gòu)遭顶。二叉樹每個節(jié)點最多有兩個孩子张峰,所以它設(shè)計一個數(shù)據(jù)域和兩個指針域是比較自然的想法。我們稱這樣的鏈表叫做二叉鏈表棒旗。

二叉樹遍歷原理

二叉樹的遍歷是從根節(jié)點出發(fā)喘批,按照某種次序依次訪問二叉樹中所有節(jié)點,使得每個節(jié)點的被訪問一次且僅被訪問一次嗦哆。

二叉樹的遍歷方法

前序遍歷:根-->左-->右

中序遍歷:左-->根-->右

后序遍歷:左-->右-->根

二叉樹遍歷的JAVA實現(xiàn)

public class BinaryTree {
    public static void main(String[] args) {
        BinaryTree binaryTree = new BinaryTree();
        System.out.print("前序遍歷:");
        binaryTree.preOrderTraverse(binaryTree.init());
        System.out.println();
        System.out.print("中序遍歷:");
        binaryTree.InOrderTraverse(binaryTree.init());
        System.out.println();
        System.out.print("后序遍歷:");
        binaryTree.PostOrderTraverse(binaryTree.init());
    }

    private BinaryTreeNode init() {
        BinaryTreeNode root = new BinaryTreeNode("a");
        BinaryTreeNode nodeB = new BinaryTreeNode("b");
        BinaryTreeNode nodeC = new BinaryTreeNode("c");
        root.setLchild(nodeB);
        root.setRchild(nodeC);
        BinaryTreeNode nodeD = new BinaryTreeNode("d");
        BinaryTreeNode nodeE = new BinaryTreeNode("e");
        nodeB.setLchild(nodeD);
        nodeB.setRchild(nodeE);
        BinaryTreeNode nodeH = new BinaryTreeNode("h");
        nodeD.setLchild(nodeH);
        BinaryTreeNode nodeK = new BinaryTreeNode("k");
        nodeH.setRchild(nodeK);
        BinaryTreeNode nodeF = new BinaryTreeNode("f");
        BinaryTreeNode nodeG = new BinaryTreeNode("g");
        nodeC.setLchild(nodeF);
        nodeC.setRchild(nodeG);
        BinaryTreeNode nodeI = new BinaryTreeNode("i");
        nodeF.setLchild(nodeI);
        BinaryTreeNode nodeJ = new BinaryTreeNode("j");
        nodeG.setRchild(nodeJ);
        return root;
    }

    /**
     * 前序遍歷
     *
     * @param binaryTreeNode
     */
    private void preOrderTraverse(BinaryTreeNode binaryTreeNode) {
        if (binaryTreeNode == null) {
            return;
        }
        System.out.print(binaryTreeNode.getData() + " ");
        preOrderTraverse(binaryTreeNode.getLchild());
        preOrderTraverse(binaryTreeNode.getRchild());
    }

    /**
     * 中序遍歷
     *
     * @param binaryTreeNode
     */
    private void InOrderTraverse(BinaryTreeNode binaryTreeNode) {
        if (binaryTreeNode == null) {
            return;
        }
        InOrderTraverse(binaryTreeNode.getLchild());
        System.out.print(binaryTreeNode.getData() + " ");
        InOrderTraverse(binaryTreeNode.getRchild());
    }

    /**
     * 后序遍歷
     *
     * @param binaryTreeNode
     */
    private void PostOrderTraverse(BinaryTreeNode binaryTreeNode) {
        if (binaryTreeNode == null) {
            return;
        }
        PostOrderTraverse(binaryTreeNode.getLchild());
        PostOrderTraverse(binaryTreeNode.getRchild());
        System.out.print(binaryTreeNode.getData() + " ");
    }

    class BinaryTreeNode {
        private String data;
        private BinaryTreeNode lchild;
        private BinaryTreeNode rchild;

        public BinaryTreeNode() {
        }

        public BinaryTreeNode(String data) {
            this.data = data;
        }

        public String getData() {
            return data;
        }

        public void setData(String data) {
            this.data = data;
        }

        public BinaryTreeNode getLchild() {
            return lchild;
        }

        public void setLchild(BinaryTreeNode lchild) {
            this.lchild = lchild;
        }

        public BinaryTreeNode getRchild() {
            return rchild;
        }

        public void setRchild(BinaryTreeNode rchild) {
            this.rchild = rchild;
        }
    }
}

線索二叉樹

指向前驅(qū)和后繼的指針為線索谤祖,加上線索的二叉鏈表稱為線索鏈表。相應(yīng)的二叉樹就稱為線索二叉樹老速。

二叉樹以某種次序遍歷使其變?yōu)榫€索二叉樹的過程稱作是線索化粥喜。

線索化的實質(zhì)

就是將二叉鏈表中的空指針改為指向前驅(qū)和后繼的線索。由于前驅(qū)和后繼的信息只有在遍歷該二叉樹時才能得到橘券。所以線索化的過程就是在遍歷的過程中修改空指針额湘。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末卿吐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锋华,更是在濱河造成了極大的恐慌嗡官,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件毯焕,死亡現(xiàn)場離奇詭異衍腥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)纳猫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門婆咸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人芜辕,你說我怎么就攤上這事尚骄。” “怎么了侵续?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵倔丈,是天一觀的道長。 經(jīng)常有香客問我状蜗,道長需五,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任诗舰,我火速辦了婚禮警儒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘眶根。我一直安慰自己,他們只是感情好边琉,可當(dāng)我...
    茶點故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布属百。 她就那樣靜靜地躺著,像睡著了一般变姨。 火紅的嫁衣襯著肌膚如雪族扰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天定欧,我揣著相機(jī)與錄音渔呵,去河邊找鬼。 笑死砍鸠,一個胖子當(dāng)著我的面吹牛扩氢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播爷辱,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼录豺,長吁一口氣:“原來是場噩夢啊……” “哼朦肘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起双饥,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤媒抠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咏花,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體趴生,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年昏翰,在試婚紗的時候發(fā)現(xiàn)自己被綠了冲秽。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡矩父,死狀恐怖锉桑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情窍株,我是刑警寧澤民轴,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站球订,受9級特大地震影響后裸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜冒滩,卻給世界環(huán)境...
    茶點故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一微驶、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧开睡,春花似錦因苹、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胁艰,卻和暖如春款筑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背腾么。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工奈梳, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人解虱。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓攘须,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饭寺。 傳聞我的和親對象是個殘疾皇子阻课,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,066評論 2 355

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

  • 四限煞、樹與二叉樹 1. 二叉樹的順序存儲結(jié)構(gòu) 二叉樹的順序存儲就是用數(shù)組存儲二叉樹抹恳。二叉樹的每個結(jié)點在順序存儲中都有...
    MinoyJet閱讀 1,537評論 0 7
  • 樹和二叉樹 一種非線性結(jié)構(gòu)。樹是遞歸結(jié)構(gòu)署驻,在樹的定義中又用到了樹的概念奋献。 基本術(shù)語: 樹結(jié)點:包含一個數(shù)據(jù)元素及若...
    北風(fēng)知我意閱讀 539評論 0 0
  • 1.樹和二叉樹的定義 (1) 樹的定義 樹是n (n≥0) 個結(jié)點的有限集。 n=0 時稱為空樹旺上。在任意一棵非空樹...
    yinxmm閱讀 2,458評論 0 3
  • 目錄 1瓶蚂、什么是樹 2、相關(guān)術(shù)語 3宣吱、二叉樹 3.1窃这、二叉樹的類型 3.2、二叉樹的性質(zhì) 3.3征候、二叉樹的結(jié)構(gòu) 3...
    我哈啊哈啊哈閱讀 2,553評論 0 10
  • 樹形結(jié)構(gòu)是一種十分重要的數(shù)據(jù)結(jié)構(gòu)杭攻。二叉樹、樹與樹林都屬于樹形結(jié)構(gòu)疤坝。 樹形結(jié)構(gòu)每個結(jié)點最多只有一個前驅(qū)結(jié)點兆解,但可以有...
    cain_huang閱讀 1,978評論 0 11