二叉树的创建和遍历

二叉树的创建和遍历:

/*
什么是二叉搜索树
二叉搜索树又叫二叉排序树或者二叉查找树 
Position Find( ElementType X, BinTree BST ):从二叉搜索树BST
中查找元素X,返回其所在结点的地址;
Position FindMin( BinTree BST ):从二叉搜索树BST中查找并返回
最小元素所在结点的地址;
Position FindMax( BinTree BST ) :从二叉搜索树BST中查找并返回
最大元素所在结点的地址。
BinTree Insert( ElementType X, BinTree BST )
BinTree Delete( ElementType X, BinTree BST )

1 二叉树的查找操作:
从根节点开始,如果为空,返回NULL
若非空.则根节点关键字和x比较,并进行不同的处理
  如果x 小于根节点的键值,在左指数中继续搜索
  如果x大于根节点的键值,在右子树中继续搜索
  如果结果相同,搜索完成,返回指向该节点的指针
  重复23步骤
2:查找二叉树的最大和最小元素
	最大元素一点是在最右分支的端节点上
	最小元素一定时在最左分支的端接点上 
3:二叉树的插入操作
	1:找到需要插入的位置
	2:比他大就插入到右边,小就插入到左边
4:二叉树的删除操作:
	当删除的是叶节点时: 
	     直接删除,在修改父节点的指针,置为Null
	当要删除的节点不是叶节点时:
		只有一个孩子时:
			直接将要删除节点的父节点指向要删除节点的子节点
		当有两个孩子时:
		 用右子树的最小树或者左子树的最大树代替 
	 
*/ 
#include<stdio.h>
#include<stdlib.h>
 
//要完成的操作
/*	1:查找操作
 	2:找到最大值和最小值
 	3:插入操作
 	4:删除操作
*/
//定义结构体:
struct TreeNode
{
	int val ;
	TreeNode* left;
	TreeNode* right; 

} ;

TreeNode* build_tree( ) ;
void show_imformation( TreeNode *root);
void find_x(TreeNode *root , int * max) ;
void find_max(TreeNode *root , int  * max) ;
void find_min(TreeNode *root , int  * max); 
//定义框架:
int main(void)
{
	TreeNode 	*root,root2;
	root2.val =NULL;
	int a =0, b = -1;
	int   *max ,*min; 
	max = &a;
	min = &b ;
	//建立树:
	root =build_tree(  ); 
	printf("创建树完成!\n") ; 
	show_imformation( root );
//	//查找某节点
	int n ;
	printf("请输入您需要查找的树:\n");
    scanf("%d" ,&n);
 	find_x( root, &n);
	
	//找到最大值
	find_max(root ,max);
	printf("\n最大值是:\n%d" ,*max); 
	//找到最小值
	find_min(root , min); 
	printf("\n最小值是:\n%d" ,*min); 
 	//插入操作
 //	insert(); 
//	//删除操作
//	delet();
//	//展示操作
//	show_imformation();
	
	return 0;
 } 
	 
struct TreeNode* build_tree() {
	int val;
	//首先将节点弄好,后面直接加到树上就可以了
	scanf("%d" ,&val);
	struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode*));
	//如果val小于等于0的话就默认为该支结束了,并没有创建(因为这是先序遍历创建的,所以要有一个暂停点不然一直创建下去)
	if (val <= 0) {
		return NULL;
	}
//如果root没有创建成功的话,就是内存分配不成功就不用往下了肯定有问题
	if (!root) {
		printf("创建失败\n");
		return NULL;
	}
//如果输入的值大于0的话,就默认是有效的输入
	if (val > 0) {
	//将该节点直接复制
		root->val = val;
		printf("请输入%d的左节点", val);
		//赋值完成了之后就继续到下一个左儿子
		root->left = build_tree();
		//左儿子完了就对右儿子进行赋值
		printf("请输入%d的右节点", val);
		root->right = build_tree();
	}
//最后将第一个节点返回就ok,最后由于是递归,所以肯定是第一个节点
	return root;
}

//展示节点:
void show_imformation( TreeNode *root)
{
	//用先序遍历的方式展示节点:
	if (root == NULL) {
		return;
	}
	printf("%d " ,root->val) ;
	show_imformation(root->left);
	show_imformation(root->right);
} 

void find_x(TreeNode *root , int  * max)
{
	//首先应该进行一次遍历:
	if (root == NULL) {
		return  ;
	}
	if(*max == root->val)
	{
		printf("\n在树里\n%d" ,*max); 
		return;
	 } 
	find_x(root->left , max);
	find_x(root->right , max);
//	printf("\n此时的max是:\n%d" ,*max); 

	return   ;
} 
//findmin 
void find_max(TreeNode *root , int  * max)
{
	//首先应该进行一次遍历:
	if (root == NULL) {
		return  ;
	}
	 
	if(*max < root->val)
	{
		*max = root->val ; 
		//printf("\n进入if后此时的max是:\n%d" ,*max);
	 } 
	find_max(root->left , max);
	//printf("\n左指数此时的max是:\n%d" ,*max);
	find_max(root->right , max);
//	printf("\n右子树此时的max是:\n%d" ,*max);
	return   ;
} 
void find_min(TreeNode *root , int  * max)
{
	//首先应该进行一次遍历:
	if (root == NULL) {
		return  ;
	}
	if(*max == -1)
	{
		*max = root->val ;
	}
	if(*max > root->val)
	{
		*max = root->val ; 
		//printf("\n进入if后此时的max是:\n%d" ,*max);
	 } 
	find_min(root->left , max);
	//printf("\n左指数此时的max是:\n%d" ,*max);
	find_min(root->right , max);
	//printf("\n右子树此时的max是:\n%d" ,*max);
	return   ;
} 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值