平衡二叉树(二叉搜索树)

平衡二叉树(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));
}
posted @   JLNU-航  阅读(669)  评论(2编辑  收藏  举报
编辑推荐:
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
阅读排行:
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· DeepSeek 解答了困扰我五年的技术问题。时代确实变了!
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!
点击右上角即可分享
微信分享提示