建樹的幾種常用方法

程式碼惠發表於2020-10-03

方法一:
此方法適用條件:

1.當我們遍歷這顆樹時只需要從父節點查詢到子節點,不需要從子節點查詢到父節點.

2.所建樹為一顆二叉樹

實現程式碼:

class Tree{
    int value;//代表該點的權值
    int left_son;//左兒子編號
    int right_son;//右兒子編號
    int leftSide_value;//連線左兒子的邊的權值
    int rightSide_value;//連線右兒子邊的權值


}

根據題目描述進行輸入.
如依次輸入 節點編號 節點權值 左兒子編號 右兒子編號 連線左兒子的邊的權值 連線右兒子邊的權值

 for(int i=1;i<=n;i++)//n代表節點的個數
        {num=sc.nextInt();

        tree[num].value=sc.nextInt();
        tree[num].left_son=sc.nextInt();
		.......
        }

方法二:
此方法適用條件:

1.當我們遍歷這顆樹時只需要從父節點查詢到子節點,不需要從子節點查詢到父節點.

2.此方法彌補了方法一的一個不足,方法一隻適用於二叉樹,不適用於有多個子節點的樹,而此方法可以可以有多個子節點

實現程式碼:

void add(int a, int b){//表示a為父 b為子
    edge[cnt] = b;
    ne[cnt] = last[a];
    last[a] = cnt++;
}

相信看到這程式碼有點暈,當初我也是,看看下面的查詢的過程
在這裡插入圖片描述
我們在看看它的儲存結構,我們按輸入的順序給節點排隊,假設存在這樣一顆樹
在這裡插入圖片描述
數字代表輸入的順序,我們展示一下樹右邊是如何聯絡起來的(cnt代表的是輸入順序並不是點真正的編號,edge[cnt]才是點真正的編號)

在這裡插入圖片描述
故可得查詢程式碼

for(int i=last[a];i>=1;i=ne[i])

持續更新!

相關文章