1. 程式人生 > >資料結構和演算法之美-二叉樹(上)

資料結構和演算法之美-二叉樹(上)

學習筆記

  • “樹”這種資料結構的形態特徵
    包括有哪些命名節點和它們的概念,這些節點是根節點,葉子節點,父節點,子節點,兄弟節點等;以及相關節點關係的建立,這些關係是父子關係和兄弟關係

  • “樹"這種資料結構的‘物理’特徵
    包括樹的高度,深度,層和樹的高度及其概念。

  • 幾種特殊二叉樹的形態特徵: 滿二叉樹,完全二叉樹。

  • 樹的儲存方法
    一種是基於指標或引用的鏈式儲存,另一種是基於陣列的順序儲存。

  • 完全二叉樹用陣列儲存以節省記憶體空間。陣列儲存演算法是:
    根節點儲存在陣列索引為1的單元,其他節點遵循如下規律-節點i(i>=2)儲存在陣列索引為i的單元=>它的左子節點儲存在陣列索引為2i的單元,它的右子節點儲存在陣列索引為2

    i+1的單元。
    如果節點i不是葉子節點(也就是說它一定不是在最後兩層),那麼節點i+1是i的兄弟節點,對於它的兄弟節點i+1而言=>它的左子節點儲存在陣列索引為2i+2的位置,它的右子節點儲存在陣列索引為
    2
    i+3的位置,於是就建立了如下連續儲存的圖示
    |
    i i+1
    2i 2i+1 2i+2 2i+3

  • 二叉樹的遍歷,包括前序遍歷演算法,中序遍歷演算法和後序遍歷演算法,每個節點最多訪問2次,所以時間複雜度是O(n),跟節點數量成正比。
    下面用C程式碼實現這三種遍歷的演算法

/*Tree*/
/*!log: [2018/11/4]write the algorithm of pr-order,in-order,post-order to travel through the tree */

#include <stdio.h>

struct kNote{
    int number;
    struct kNote *left;
    struct kNote *right;
};

void preOrder(struct kNote *root)
{
    if(NULL == root)
    {
        return;
    }
    else
    {
        printf("Current number:%d\n", root->number);
        preOrder(root->left);
        preOrder(root->right);
    }
}

void inOrder(struct kNote *root)
{
   if(NULL == root)
    {
        return;
    }
    else
    {
        inOrder(root->left);
        printf("Current number:%d\n", root->number);
        inOrder(root->right);
    }
}

void postOrder(struct kNote *root)
{
   if(NULL == root)
    {
        return;
    }
    else
    {
        postOrder(root->left);
        postOrder(root->right);
        printf("Current number:%d\n", root->number);
    }
}