二叉樹最大高度與寬度

2022-05-05 18:00:07 字數 1491 閱讀 8397

原題來自維基oi

二叉樹最大寬度與高度

題目描述:給出乙個二叉樹,輸出它的最大寬度和高度.

輸入描述:第一行乙個整數n.下面n行每行有兩個數,對於第i行的兩個數,代表編號為i的節點所連線的兩個左右兒子的編號.如果沒有某個兒子為空,則為0.

輸出描述:輸出一共三行,分別為前序遍歷,中序遍歷和後序遍歷.編號之間用空格隔開.

說明:預設結點1是根節點,根節點的高度為1.

大概思路:高度就是最下方結點的層數,寬度就是層結點數最多層的結點數.

以這棵樹為例,高度就是最下方結點(綠色結點)的層數,也就是4;寬度就是層結點數最多層(第4層)的結點數.

第一步:用乙個多維陣列tree[21][4]來儲存這棵樹,tree[n][0]為結點n的左子樹,[n][1]為結點n的右子樹,[n][2]為結點n的父親,[n][3]為結點n所在層數.

根據輸入描述,第i個結點的左兒子和右兒子都是在第i行讀入的,當讀入第i行時,如果有左兒子就把左兒子的父親設為i,右兒子同理.

第二步:把tree[1][3]設為1,因為預設結點1高度為1.因為每個非根結點所在的層數是它父親所在層數+1,**表示:tree[i][3]=tree[tree[i][2]][3]+1;

遞推算出每1層的層數,算出層數的同時直接尋找最大值.

第三步:在第二步執行過程中,如果碰到乙個結點屬於第i層,那麼layer[i]+1(初始每個元素都為0),到第二步執行完成,就尋找layer中的最大值,最大值的下標就是寬度.

ac**如下:

1 #include 2 #include 3

4using

namespace

std;56

int tree[21][4];/*

二維陣列tree,儲存了輸入的二叉樹 */7

/*tree[n][0]為結點n的左子樹,[n][1]為結點n的右子樹,[n][2]為結點n的父親,[n][3]為結點n所在層數 */8

int layer[20];/*

層數陣列,layer[i]就是第i層的結點數,也就是第i層的寬度 */9

int findmax()/*

找到layer中的最大值,也就是也就是最大寬度

*/1018}

19return

maxmium;20}

21int

main()

2233

if (tree[i][1] != 0)34

37}38 tree[1][3] = 1;/*

根結點的層數預設為1

*/39 layer[1]=1;/*

第一層的寬度一定為1

*/40

for (int i = 2; i <= n; i++)

4148

}49 cout << findmax() << '

'<< depth;/*

輸出 */

50return0;

51 }

如果有什麼不合理之處,敬請批評指正

二叉樹最大寬度和高度

題目描述 description 給出乙個二叉樹,輸出它的最大寬度和高度。輸入描述 input description 第一行乙個整數n。下面n行每行有兩個數,對於第i行的兩個數,代表編號為i的節點所連線的兩個左右兒子的編號。如果沒有某個兒子為空,則為0。輸出描述 output descriptio...

樹 二叉樹最大寬度和高度

題目描述 題目描述 description 給出乙個二叉樹,輸出它的最大寬度和高度。輸入描述 input description 第一行乙個整數n。下面n行每行有兩個數,對於第i行的兩個數,代表編號為i的節點所連線的兩個左右兒子的編號。如果沒有某個兒子為空,則為0。輸出描述 output descr...

二叉樹的最大寬度和高度

題目描述 description 給出乙個二叉樹,輸出它的最大寬度和高度。輸入描述 input description 第一行乙個整數n。下面n行每行有兩個數,對於第i行的兩個數,代表編號為i的節點所連線的兩個左右兒子的編號。如果沒有某個兒子為空,則為0。輸出描述 output descriptio...