平衡二叉树(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)); }