C 日常小題 計算二叉查詢樹的高度

2021-07-25 18:04:47 字數 2470 閱讀 8043

給定乙個二叉查詢樹,要求計算其高度,每個二叉查詢樹將給出先序與中序的遍歷。

例如:乙個二叉查詢樹其先序遍歷為:16, 10, 4, 15, 23 ; 中序遍歷為 4, 10, 15, 16, 23,則其高度為2(假定空樹高度為-1,只有根節點的數高度為0)

第一行輸入測試用例個數。

對於每個測試用例,

第一行是節點個數n,第二行是key值的先序遍歷,第三行是key值的中序遍歷

對於每個測試用例,用一行輸出樹的高度

2 3

4 5 6

4 5 6

5 6 4 8 9 10

4 6 8 9 102 3

首先,根據二叉樹的遍歷特性

可以推出,先序遍歷的第乙個元素就為二叉樹的根結點。

又在中序遍歷中,若找到根節點,則根節點左側的為其左子樹結點,右側的為其右子樹結點。

為了更方便闡述,設幾個變數

若根結點有左子樹,則先序遍歷中下標為root + 1的結點為其左子樹的根結點,[left, pos)為其左子樹的所有結點。

當前根結點在先序遍歷中下標為root + pos - left + 1的結點為右子樹的根結點,[pos + 1, right)為其右子樹的所有結點。

知道了左子樹和右子樹的元素,並且找到了兩個子樹的根結點,通過同樣的方法,在左右子樹中分別再找其左右子樹,這樣遞迴下去,可以確定唯一的二叉樹。

這道題只要求出樹的高度,那麼我們可以認為,若乙個樹有左子樹或者右子樹,則樹的高度 + 1。

上面的描述可能不是很準確,舉個例子更清楚一點,一棵有9個結點的二叉樹

根樹

根結點為 5;

左子樹的根結點為2先序遍歷中下標為root + 1 = 1;所有結點為1 2 3 4中序遍歷中下標範圍為[0, 4)

右子樹的根結點為8先序遍歷中下標為root + pos - left + 1 = 5;所有結點為6 7 8 9中序遍歷中下標範圍為[5, 9)

根樹的左子樹

根結點為 2;

左子樹的左子樹的根結點為1先序遍歷中下標為root + 1 = 2;所有結點為1中序遍歷中下標範圍為[0, 1)

左子樹的右子樹的根結點為4先序遍歷中下標為root + pos - left + 1 = 3;所有結點為3 4中序遍歷中下標範圍為[2, 4)

根樹的右左子樹

根結點為 8;

左子樹的左子樹的根結點為7先序遍歷中下標為root + 1 = 6;所有結點為6 7中序遍歷中下標範圍為[5, 7)

左子樹的右子樹的根結點為9先序遍歷中下標為root + pos - left + 1 = 8;所有結點為9中序遍歷中下標範圍為[8, 9)

左子樹的左子樹和右子樹,右子樹的左子樹和右子樹同理遞迴下去,就不再繼續列出來了。

#include 

int preorder[1000001]; // 先序遍歷

int inorder[1000001]; // 中序遍歷

int height = 0; // 樹的高度

void findheight(int root, int left, int right, int h);

int main()

return0;}

void findheight(int root, int left, int right, int h)

以上所有,如有錯誤,麻煩指出,我會及時更改的。

sicily 1003 計算二叉查詢樹的高度

考點 用先序遍歷和中序遍歷查詢二叉樹的高度 給定乙個二叉查詢樹,要求計算其高度,每個二叉查詢樹將給出先序與中序的遍歷。例如 乙個二叉查詢樹其先序遍歷為 16,10,4,15,23 中序遍歷為 4,10,15,16,23,則其高度為2 假定空樹高度為 1,只有根節點的數高度為0 第一行輸入測試用例個數...

二叉查詢樹 C

include stdafx.h include using namespace std 二叉查詢樹的性質 1.二叉排序樹或為空樹 2.若左子樹不為空,則左子樹中所有節點的值均小於或等於根節點 3.若右子樹不為空,則右子樹中所有節點的值均大於或等於跟節點 4.左右子樹也為二叉排序樹 5.二叉排序樹採...

C 二叉查詢樹

二叉排序樹 binary sort tree 又稱二叉查詢樹 binary search tree 亦稱二叉搜尋樹。二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點...