zoukankan      html  css  js  c++  java
  • 平衡二叉树(二叉搜索树)

    平衡二叉树(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
    ",Get_Height(tree.root));  //打印树的高度
        printf("%d
    ",Get_Max(tree.root));
    }
    
  • 相关阅读:
    ajax
    导入操作
    游标的使用
    多行编辑
    IOS开发之--NSPredicate
    asp.net DataTables
    asp.net 汉字转拼音的车祸现场
    Git 连接细节
    Aspose.Words 操作指北
    码云代码管理插件备忘
  • 原文地址:https://www.cnblogs.com/julyzqy/p/12777590.html
Copyright © 2011-2022 走看看