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

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

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

考慮一種極端情況,一棵深度為k的右斜數(shù),它只有k個(gè)節(jié)點(diǎn),卻需要分配2^k-1個(gè)存儲(chǔ)單元,這顯然是對(duì)空間的浪費(fèi),所以順序的存儲(chǔ)結(jié)構(gòu)只適用于完全二叉樹。

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

二叉樹遍歷原理

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

二叉樹的遍歷方法

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

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

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

二叉樹遍歷的JAVA實(shí)現(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)榫€索二叉樹的過程稱作是線索化。

線索化的實(shí)質(zhì)

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 四、樹與二叉樹 1. 二叉樹的順序存儲(chǔ)結(jié)構(gòu) 二叉樹的順序存儲(chǔ)就是用數(shù)組存儲(chǔ)二叉樹。二叉樹的每個(gè)結(jié)點(diǎn)在順序存儲(chǔ)中都有...
    MinoyJet閱讀 1,741評(píng)論 0 7
  • 樹和二叉樹 一種非線性結(jié)構(gòu)。樹是遞歸結(jié)構(gòu),在樹的定義中又用到了樹的概念。 基本術(shù)語: 樹結(jié)點(diǎn):包含一個(gè)數(shù)據(jù)元素及若...
    北風(fēng)知我意閱讀 588評(píng)論 0 0
  • 1.樹和二叉樹的定義 (1) 樹的定義 樹是n (n≥0) 個(gè)結(jié)點(diǎn)的有限集。 n=0 時(shí)稱為空樹。在任意一棵非空樹...
    yinxmm閱讀 2,581評(píng)論 0 3
  • 目錄 1、什么是樹 2、相關(guān)術(shù)語 3、二叉樹 3.1、二叉樹的類型 3.2、二叉樹的性質(zhì) 3.3、二叉樹的結(jié)構(gòu) 3...
    我哈啊哈啊哈閱讀 2,718評(píng)論 0 10
  • 樹形結(jié)構(gòu)是一種十分重要的數(shù)據(jù)結(jié)構(gòu)。二叉樹、樹與樹林都屬于樹形結(jié)構(gòu)。 樹形結(jié)構(gòu)每個(gè)結(jié)點(diǎn)最多只有一個(gè)前驅(qū)結(jié)點(diǎn),但可以有...
    cain_huang閱讀 2,117評(píng)論 0 11

友情鏈接更多精彩內(nèi)容