樹&堆

什麼是樹?

大概像下面這樣:node

樹的概念

樹的每一個點被稱爲節點;數組

鏈接的兩個點,一個爲父節點,一個爲子節點,例如上圖中,\(1\)\(4\)的父節點,\(4\)\(1\)的子節點;spa

沒有父節點的節點稱爲根節點,注意:每個非根節點的節點有且只有一個父節點;code

沒有子節點的節點稱爲葉子節點,如上圖中,\(6,10,5,9,7,8\)是葉子節點;blog

一棵樹必然由\(n\)個節點,\(n-1\)條邊組成;class

除了根節點外,每一個子節點能夠分爲多個不相交的子樹;二叉樹

同「輩分」的節點在樹的同一層裏,例如上圖,\(2,3,4\)是同一層的;遍歷

樹的深度就是樹的層數,例如上圖,樹的深度爲\(3\)im

樹裏面沒有環!db

樹的存儲

使用結構體數組

struct node
{
    int data,father;
    //data表明這個節點的編號
    //father表明這個節點的父節點的編號
}tree[...];

二叉樹

一種特殊的樹,一個節點最多隻能有\(2\)個子節點,大概長下面這樣:

樹的概念在二叉樹中一樣有用,另外,還有幾個二叉樹獨有的性質:

在二叉樹的第\(i\)層上最多有\(2^{i-1}\)個節點\((i \ge 1)\)

深度爲\(k\)的二叉樹至多有\(2^{k-1}\)個節點\((k \ge 1)\)

滿二叉樹

一棵深度爲\(n\),節點數爲\(2^{n-1}\)的二叉樹,就像下圖:

徹底二叉樹

一棵從上向下,從左向右標號和滿二叉樹對應的二叉樹,以下圖:

二叉樹的存儲

依然使用結構體數組。

struct node
{
    int lchild,rchild,father;
    //lchild表明這個節點的左子節點
    //rchild表明這個節點的右子節點
    //father表明這個節點的父節點的編號
}tree[...];

二叉樹的遍歷

前序遍歷

二叉樹的前序遍歷順序爲:

1.訪問父節點

2.前序遍歷左子樹

3.前序遍歷右子樹

\(Code:\)

void qianxu(int a)
{
    if(a)
    {
        cout<<a<<" ";
        qianxu(tree[a].lchild);
        qianxu(tree[a].rchild);
    }
    return ;
}

如上圖,遍歷結果爲:1 3 9 5 4 6 10 2 7 8

中序遍歷

二叉樹的前序遍歷順序爲:

1.前序遍歷左子樹

2.訪問父節點

3.前序遍歷右子樹

\(Code:\)

void zhongxu(int a)
{
    if(a)
    {
        zhongxu(tree[a].lchild);
        cout<<a<<" ";
        zhongxu(tree[a].rchild);
    }
}

如上圖,遍歷結果爲:9 3 6 4 10 5 1 7 2 8

後序遍歷

二叉樹的前序遍歷順序爲:

1.前序遍歷左子樹

2.前序遍歷右子樹

3.訪問父節點

\(Code:\)

void houxu(int a)
{
    if(a)
    {
        houxu(tree[a].lchild);
        houxu(tree[a].rchild);
        cout<<a<<" ";
    }
}

如上圖,遍歷結果爲:9 6 10 4 5 3 7 8 2 1

一種特殊的徹底二叉樹,分小根堆和大根堆兩種堆。

大根堆:父節點必定比子節點大;

長的以下:

小根堆:父節點必定比子節點小。

長的以下:

相關文章
相關標籤/搜索