<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                轉載請注明出處 http://blog.csdn.net/pony_maggie/article/details/38390513 作者:小馬 一 二叉樹的一些概念 二叉樹就是每個結點最多有兩個子樹的樹形存儲結構。先上圖,方便后面分析。 ![](https://box.kancloud.cn/2016-06-13_575e929540476.jpg) **1 滿二叉樹和完全二叉樹** 上圖就是典型的二叉樹,其中左邊的圖還叫做滿二叉樹,右邊是完全二叉樹。然后我們可以得出結論,滿二叉樹一定是完全二叉樹,但是反過來就不一定。滿二叉樹的定義是除了葉子結點,其它結點左右孩子都有,深度為k的滿二叉樹,結點數就是2的k次方減1。完全二叉樹是每個結點都與深度為k的滿二叉樹中編號從1到n一一對應。 **2 樹的深度** 樹的最大層次就是深度,比如上圖,深度是4。很容易得出,深度為k的樹,擁有的最大結點數是2的k次方減1。 **3 樹的孩子,兄弟,雙親** 上圖中,B,C是A的孩子,B,C之間互為兄弟,A是B,C的雙親。 二如何創建二叉樹 先說說二叉樹的存儲結構,跟很多其它模型一樣,也有順序和鏈式兩種方式。前者雖然使用簡單,但是存在浪費空間的問題,舉個例子,下圖的二叉樹,用順序的方式存儲(0表示空,沒有子樹)是: 1 2 3 4 5 6 7 0 0 0 0 8 0 0 0 ![](https://box.kancloud.cn/2016-06-13_575e92955825f.jpg) 是不是相當浪費空間呢。 鏈式結構可以定義如下: ~~~ typedef struct _BiTNode { int data; _BiTNode *leftChild; _BiTNode *rightChild; }BiTNode, *pBiTree; ~~~ 然后就可以寫一個函數來創建二叉樹,過程是在控制臺輸入a表示退出當前這一層,不再為該層創建左右孩子。輸入其它字母表示繼續創建。比如下面的輸入序列: ![](https://box.kancloud.cn/2016-06-13_575e92956a6e8.jpg) 創建了如下結構的二叉樹, ![](https://box.kancloud.cn/2016-06-13_575e92957cea9.jpg) 每個結點里的數值是隨機生成的小于100的數字。同時我也寫了一個自動的命令序列函數,方便測試,不用手動輸入,非自動和自動創建的函數如下: ~~~ //創建二叉樹, 先序順序 int CreateBiTree(pBiTree *root) { char ch = 0; fflush(stdin); if ((ch = getchar()) == 'a')//控制樹的結構 { *root = NULL; } else { *root = (BiTNode *)malloc(sizeof(BiTNode)); if (!(*root)) { return RET_ERROR; } (*root)->data = GetRandom(); CreateBiTree(&(*root)->leftChild); CreateBiTree(&(*root)->rightChild); } return RET_OK; } int g_i = 0; //創建二叉樹,自動執行,方便測試 int CreateBiTreeAuto(pBiTree *root) { char szOrder[] = "bbaabaa"; char ch = 0; if (szOrder[g_i++] == 'a')//控制樹的結構 { *root = NULL; } else { *root = (BiTNode *)malloc(sizeof(BiTNode)); if (!(*root)) { return RET_ERROR; } (*root)->data = GetRandom(); CreateBiTreeAuto(&(*root)->leftChild); CreateBiTreeAuto(&(*root)->rightChild); } return RET_OK; } ~~~ 三遍歷順序 **先序遍歷** 先序遍歷是先訪問根結點,再左子樹,再右子樹,比如圖1中的右圖,先序遍歷的輸出如下: A,B,D,H,I,E,J,K,C,F,G 根據上面的思想,很容易用遞歸的形式寫出先序遍歷的代碼: ~~~ //先序遍歷 int PreOrderVisitTree(pBiTree T, VisitType pFuncVisit) { if (T) { (*pFuncVisit)(T->data); if (PreOrderVisitTree(T->leftChild, pFuncVisit) == RET_OK) { if (PreOrderVisitTree(T->rightChild, pFuncVisit) == RET_OK) { return RET_OK; } } return RET_ERROR; } else { return RET_OK; } } ~~~ **中序遍歷和后序遍歷** 有了先序的經驗,這兩個就很好理解了,中序是先訪問左子樹, 再根結點,再右子樹, 后序是先訪問左子樹, 再右子樹,再根結點。代碼更容易,只要改一下調用順序就可以了。 不過我這里給出一種非遞歸的實現。遞歸固然是清晰明了,但是存在效率低的問題,非遞歸的方案用棧結構來存結點信息,通過出棧訪問來遍歷二叉樹。它思想是這樣的,當棧頂中的指針非空時,遍歷左子樹,也就是左子樹根的指針進棧。當棧頂指針為空時,應退至上一層,如果是從左子樹返回的,訪問當前層,也就是棧頂中的根指針結點。如果是從右子樹返回,說明當前層遍歷完畢,繼續退棧。代碼如下: ~~~ //中序遍歷, 非遞歸實現 int InOrderVisitTree(pBiTree T, VisitType pFuncVisit) { ponyStack binaryTreeStack; InitStack(&binaryTreeStack, 4); Push(&binaryTreeStack, &T); pBiTree pTempNode; while (!IsEmptyStack(binaryTreeStack)) { while((GetTop(binaryTreeStack, &pTempNode) == RET_OK) && (pTempNode != NULL)) { Push(&binaryTreeStack, &(pTempNode->leftChild)); } Pop(&binaryTreeStack, &pTempNode); if (!IsEmptyStack(binaryTreeStack)) { Pop(&binaryTreeStack, &pTempNode); (*pFuncVisit)(pTempNode->data); Push(&binaryTreeStack, &(pTempNode->rightChild)); } } return RET_OK; } ~~~ 代碼下載地址: http://download.csdn.net/detail/pony_maggie/7714493 或 https://github.com/pony-maggie/BinaryTreeDemo
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看