首先定義節點:
#include#include#includeclass node
;node::node(int d)
node::node(node* other)
int node::calculatedistance()
int node::calculateheight()
這裡有計算左右子樹高度差的函式,左子樹高度-右子樹的高度。
還有計算該節點在樹中的高度,在左右子樹的更高者的基礎上加1。
然後定義二叉平衡樹:
#include"node.h"
class tree
;tree::tree()
void tree::insert(int data)
node* newnode = new node(data);
if(data <= pre->data)
pre->leftchild = newnode;
else
pre->rightchild = newnode;
newnode->father = pre;
node* fathernode = pre;
current = newnode;
while(pre != null)
if(pre->leftchild->distance == -1)
// pre = pre->father;
}if(pre->distance == -2)
if(pre->rightchild->distance == 1)
}current = pre;
pre = pre->father;
} } count++;
}void tree::left_rotate(node* target)
else
left2right = null;
if(top != null)
up->father = top;
up->leftchild = target;
target->father = up;
target->rightchild = left2right;
if(left2right != null)
left2right->father = target;
target->height = target->calculateheight();
target->distance = target->calculatedistance();
up->height = up->calculateheight();
up->distance = up->calculatedistance();
top->height = top->calculateheight();
top->distance = top->calculatedistance();
delete(tempup);
delete(templeft2right);
// target = target->father;
}void tree::right_rotate(node* target)
else
right2left = null;
if(top != null)
up->father = top;
up->rightchild = target;
target->father = up;
target->leftchild = right2left;
if(right2left != null)
right2left->father = target;
target->height = target->calculateheight();
target->distance = target->calculatedistance();
up->height = up->calculateheight();
up->distance = up->calculatedistance();
top->height = top->calculateheight();
top->distance = top->calculatedistance();
delete(tempup);
delete(tempright2left);
}int tree::size()
void tree::display()
void tree::pre_order(node* cur)
}
二叉平衡樹的關鍵是,它能夠在插入所有元素之後保持平衡,左右子樹的高度差不會超過1。所以在每次插入完元素後,檢查二叉平衡樹是否平衡。只要從插入點開始檢查,一直往樹的根端檢查即可。(其實只需檢查乙個點)然後確定需要哪種旋轉,是單旋轉還是雙旋轉。這裡,我用了新的指標來代表旋轉所得的新位置。注意指標的指向的改變。
平衡二叉樹 AVL 實現(3)
現象1 注意 q是30,而不是20,因為刪除了25,節點會移動,以下現象均遵循此規律 現象2 現象3 現象1和現象2比較簡單,不需要平衡化處理,現象3則比較複雜.先討論現象1和2 先找到節點,然後刪除節點 private node findnode int value if value node.d...
平衡二叉樹 AVL 實現 2
繼續討論旋轉 為了方便討論是做點記號 x為插入的節點p為旋轉軸 p有時候為x的父節點如ll,rr旋轉 p有時候也為x,如lr,rl旋轉 r為平衡因子絕對值 2的節點 看下面四種情況 當三個節點處於一條直線,並均是左節點時,需要以中間的節點為旋轉軸向右側 順時針 旋轉一次 使得c成為b的右子節點 b代...
平衡二叉樹(AVL樹)
左右子樹高度之差的絕對值不超過1,左右子樹高度之差稱為該結點的平衡因子。通過對樹的結構進行調整,使樹的高度在每次插入結束後仍能保持o logn 的級別。引入變數height來記錄高度struct node 新建乙個結點 1.申請變數空間 2 初始結點權值,高度 1 3 初始左右孩子為空 4 返回新建...