1. 程式人生 > >平衡二叉樹(二叉搜尋樹)

平衡二叉樹(二叉搜尋樹)

    平衡二叉樹(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