平衡二叉樹(二叉搜尋樹)
阿新 • • 發佈:2019-10-30
平衡二叉樹(Balanced Binary Tree)具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。平衡二叉樹的常用實現方法有紅黑樹、AVL、替罪羊樹、Treap、伸展樹等。
最小二叉平衡樹的節點的公式如下 F(n)=F(n-1)+F(n-2)+1 這個類似於一個遞迴的數列,可以參考Fibonacci數列,1是根節點,F(n-1)是左子樹的節點數量,F(n-2)是右子樹的節點數量。
特殊的二叉樹,又稱為排序二叉樹、二叉搜尋樹、二叉排序樹。
二叉查詢樹實際上是資料域有序的二叉樹,
即對樹上的每個結點,都滿足其左子樹上所有結點的資料域均小於或等於根結點的資料域,
右子樹上所有結點的資料域均大於根結點的資料域。如下圖所示:
其中左節點要比當前子樹根節點小,右節點要比當前子樹根節點大,如第一次進入二叉樹,
根節點為temp為5,再進來3和根節點比較,發現根節點的左節點為空,所以3放在5的左節點,進來7,比5大,5的右節點為空,7到5的右節點,再進來2,找到5,比5小,進去繼續找,發現5的左節點不為空,temp為3作當前小平衡樹的根,發現3的左為空,此時將2放到3的左節點....
程式碼實現:
#include<stdio.h> #include<stdlib.h> typedef struct node{ int data; struct node *left; struct node *right; }Node; typedef struct{ Node *root; }Tree; void insert(Tree *tree,int value){//插入數value Node *node; node=(Node *)malloc(sizeof(Node)); node->data=value; node->left=NULL; node->right=NULL; if(tree->root==NULL){ tree->root=node; } else{ Node *temp=tree->root; //當前比較的臨時根節點 while(temp!=NULL){ if(value<temp->data){ if(temp->left==NULL){ temp->left=node; return; } else { temp=temp->left; } } else{ if(temp->right==NULL){ temp->right=node; return; } else { temp=temp->right; } } } } } void inorder(Node *node){ //中序遍歷 if(node!=NULL){ inorder(node->left); printf("%d ",node->data); inorder(node->right); } } int Get_Height(Node *node){ //計算高度 int max; if(node==NULL) return 0; else{ int left_height=Get_Height(node->left); int right_height=Get_Height(node->right); max=left_height; if(right_height>max){ max=right_height; } return max+1; } } int Get_Max(Node *node){ //求樹裡的最大值 int max; if(node==NULL){ return -1; } else{ int m1=Get_Max(node->left); int m2=Get_Max(node->right); int m3=node->data; max=m1; if(m2>max) max=m2; if(m3>max) max=m3; } return max; } int main() { int arry[7]={6,3,8,2,5,1,7}; Tree tree; tree.root=NULL; for(int i=0;i<7;i++){ insert(&tree,arry[i]) ; } inorder(tree.root); printf("%d\n",Get_Height(tree.root)); //列印樹的高度 printf("%d\n",Get_Max(tree.root)); }
&n