原題來自維基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 34using
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...