根據給定的輸入序列建立一棵平衡二叉樹,求出建立的平衡二叉樹的樹根。
輸入一組測試資料。資料的第1行給出乙個正整數n(n <= 20),n表示輸入序列的元素個數;第2行給出n個正整數,按資料給定順序建立平衡二叉樹。
輸出平衡二叉樹的樹根。
588 70 61 96 120
70一定要記住每一步的回溯,搞清楚根節點是什麼,根據二叉樹的左右子樹的高度差來判斷進行什麼樣的調整
1.調整方法
(1)插入點位置必須滿足二叉查詢樹的性質,即任意一棵子樹的左結點都小於根結點,右結點大於根結點
(2)找出插入結點後不平衡的最小二叉樹進行調整,如果是整個樹不平衡,才進行整個樹的調整。
2.調整方式
(1)ll型
ll型:插入位置為左子樹的左結點,進行向右旋轉
由於在a的左孩子b的左子樹上插入結點f,使a的平衡因子由1變為2,成為不平衡的最小二叉樹根結點。此時a結點順時針右旋轉,旋轉過程中遵循「旋轉優先」的規則,a結點替換d結點成為b結點的右子樹,d結點成為a結點的左孩子。
(2)rr型
rr型:插入位置
為右子樹的右孩子,進行向左旋轉
由於在a的右子樹c的右子樹插入了結點f,a的平衡因子由-1變為-2,成為不平衡的最小二叉樹根結點。此時,a結點逆時針左旋轉,遵循「旋轉優先」的規則,a結點替換d結點成為c的左子樹,d結點成為a的右子樹。 (
(3)lr型
lr型:插入位置為
左子樹的右孩子,要進行兩次旋轉,先左旋轉(rr型),再右旋轉(ll型);第一次最小不平衡子樹的根結點先不動,調整插入結點所在的子樹,第二次再調整最小不平衡子樹。
由於在a的左子樹b的右子樹上插入了結點f,a的平衡因子由1變為了2,成為不平衡的最小二叉樹根結點。第一次旋轉a結點不動,先將b的右子樹的根結點d向左上旋轉提公升到b結點的位置,然後再把該d結點向右上旋轉提公升到a結點的位置。
(4)rl型
rl型:插入位置為右子樹的左孩子,進行兩次調整,先右旋轉再左旋轉;處理情況與lr類似。
struct node *ll(struct node *head)//右旋
struct node *rr(struct node *head)//左旋
struct node *lr(struct node *head)
struct node *rl(struct node *head)
struct node *creat(struct node *head,int x)
else if (head->data > x)
}else if (head->data < x)
}head->d = max(deep(head->lchild),deep(head->rchild))+1;
return head;
}int main()
平衡二叉樹 資料結構實驗之查詢二 平衡二叉樹
剛開始接觸平衡二叉樹,沒有什麼太多要分析的。部落格裡有很多大佬們都寫的很好。平衡二叉樹就是每個節點的子樹的高度差不超過1的二叉樹。可以快速搜尋數值的一種演算法,最糟的情況就是一直找到底,但也是log n 的。還是快很多。include include include define max a b a...
資料結構實驗之查詢二 平衡二叉樹
建立平衡二叉樹,我們採用依次插入節點的方式進行。而平衡二叉樹上插入節點採用遞迴的方式進行。遞迴演算法如下 1 若該樹為一空樹,那麼插入乙個資料元素為e的新節點作為平衡二叉樹的根節點,樹的高度增加1。2 若待插入的資料元素e和平衡二叉樹 bbst 的根節點的關鍵字相等,那麼就不需要進行插入操作。3 若...
資料結構實驗之查詢二 平衡二叉樹
time limit 400ms memory limit 65536k 根據給定的輸入序列建立一棵平衡二叉樹,求出建立的平衡二叉樹的樹根。輸入一組測試資料。資料的第1行給出乙個正整數n n 20 n表示輸入序列的元素個數 第2行給出n個正整數,按資料給定順序建立平衡二叉樹。輸出平衡二叉樹的樹根。5...