二叉树搜索树
前言
二叉查找树(Binary Search Tree,BST),又叫做二叉排序树、二叉搜索树,是一种对查找和排序都有用的特殊二叉树,红黑树,AVL树都是特殊的二叉查找树(自平衡二叉搜索树)
二叉查找树或是空树,或是满足如下三个性质的二叉树:
- 若其左子树非空,则左子树上所有节点的值都小于根节点的值
- 若其右子树非空,则右子树上所有节点的值都大于根节点的值
- 其左右子树都是一棵二叉查找树
创建,树高,树中最大值
话不多说,上代码(源于B站博主:正月点灯笼)
看完视频,自己手动敲出来的,分享出来也是方便自己复习。
主要是网上全是部分代码,大家都会,但是把他整合在一起就可能会报错。完整代码还是容易理解来龙去脉些。
//二叉树搜索树的初步建立
#include<stdio.h>
#include<stdlib.h>
typedef struct node{
int data;
struct node* lchild;
struct node* rchild;
}Node;
typedef struct{
Node* root;
}Tree;
void Insert(Tree* tree,int value){
//创建树的根结点
Node* node = (Node *)malloc(sizeof(Node));
node -> data = value;
node -> lchild = NULL;
node -> rchild = NULL;
//如果树为空,则指向自己
if(tree -> root == NULL){
tree -> root = node;
}
else{
//创建另一个指针,用于创建树的遍历
Node* temp = tree -> root;
while(temp != NULL){
if(value < temp -> data){
if(temp -> lchild == NULL){
temp -> lchild = node;
return ;
}
else{
temp = temp -> lchild;
}
}
else{
if(temp -> rchild == NULL){
temp -> rchild = node;
return ;
}
else{
temp = temp -> rchild;
}
}
}
}
}
//获取的树高
int GetTreeHeight(Node* node){
if(node == NULL){
return 0;
}
else{
int left_h = GetTreeHeight(node -> lchild);
int right_h = GetTreeHeight(node -> rchild);
int max = left_h;
if(right_h > max){
max = right_h;
}
return max + 1;
}
}
//获取树中的最大值
int GetTreeMax(Node* node){
if(node == NULL){
return -1;//表示树为空
}
else{
int m1 = GetTreeMax(node -> lchild);
int m2 = GetTreeMax(node -> rchild);
int m3 = node -> data;
int max = m1;
if(m2 > max) max = m2;
if(m3 > max) max = m3;
return max;
}
}
//先序遍历
void PreOrder(Node* b){
if(b != NULL){
printf("%d\n",b -> data);
PreOrder(b -> lchild);
PreOrder(b -> rchild);
}
}
//中序遍历
void InOrder(Node* b){
if(b != NULL){
InOrder(b -> lchild);
printf("%d\n",b -> data);
InOrder(b -> rchild);
}
}
//后序遍历
void PostOrder(Node* b){
if(b != NULL){
PostOrder(b -> rchild);
PostOrder(b -> lchild);
printf("%d\n",b -> data);
}
}
int main(){
int arr[7] = {6,3,8,2,5,1,7};
Tree tree;
tree.root = NULL;
for(int i=0;i<7;i++){
Insert(&tree,arr[i]);
}
InOrder(tree.root);//中序遍历是二叉搜索树从小到大的数组
int height = GetTreeHeight(tree.root);
printf("树的高度为:%d\n",height);
int TreeMaxnum = GetTreeMax(tree.root);
printf("树中最大的数值:%d\n",TreeMaxnum);
}
注意事项:当node是指针类型的时候只用箭头(->),而不能用点(.)
只有是实体才能用点(.),不然会报错的。
如果结点为负数,还有查找删除之类基本操作。会在后续会继续更新!!!!