AVL樹的實現(C )

2021-06-09 20:39:05 字數 2487 閱讀 4396

首先定義節點:

#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 返回新建...