二叉搜索树小结

前言

二叉查找树(Binary Search Tree,BST),又叫做二叉排序树、二叉搜索树,是一种对查找和排序都有用的特殊二叉树,红黑树,AVL树都是特殊的二叉查找树(自平衡二叉搜索树)
二叉查找树或是空树,或是满足如下三个性质的二叉树:

  1. 若其左子树非空,则左子树上所有节点的值都小于根节点的值
  2. 若其右子树非空,则右子树上所有节点的值都大于根节点的值
  3. 其左右子树都是一棵二叉查找树

创建,树高,树中最大值

话不多说,上代码(源于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是指针类型的时候只用箭头(->),而不能用点(.)
只有是实体才能用点(.),不然会报错的。

如果结点为负数,还有查找删除之类基本操作。会在后续会继续更新!!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值