二叉排序树 插入,创建,中序遍历,最大,最小值,层级,打印,删除,搜索

46 篇文章 0 订阅
37 篇文章 3 订阅

排序二叉树的性质如下:

若他的左子树不空,则左子树上所有的结点均小于它的根结点的值。

若他的右子树不空,则右子树上所有的结点均大于它的根结点的值。

他的左右子树也是排序二叉树。


深度为k的完全二叉树至少有2^(k - 1)个结点;

最多有2^k - 1个结点。





#include<iostream>

using namespace std;

struct Node
{
	int data;
	Node *lchild;
	Node *rchild;
};

Node *Tree_Insert(Node *T, int key);	// 二叉排序的树的插入
Node *Create();							// 二叉树的创建
void inOrder(Node *T);					// 二叉排序树的中序遍历
int Tree_Min(Node *T);					// 二叉树中的最小值
int Tree_Max(Node *T);					// 二叉树中的最大值
int Tree_CengNum(Node *T);				// 计算二叉树的层级
void Level_Print(Node *T, int level);	// 打印二叉树某一层的所有结点
int Level_Count(Node *T, int level);	// 打印二叉树某一层的结点个数
bool Tree_Search(Node *T, int key);		// 二叉树的搜索
void Delete(Node *T, int k);			 // 删除某个元素的结点

void Delete(Node *T, int k)
{
	if(Tree_Search(T, k))
	{
		// 查找 要删除的结点temp
		Node *temp = T;
		while(temp)
		{
			if(temp->data == k)
				break;
			else
				temp = (k < temp->data) ? temp->lchild : temp->rchild;
		}

		if(temp->lchild)	// 若有左子树
		{
			Node *temp1 = temp->lchild;
			Node *temp2 = temp1;
			while(temp2->rchild)	// 去查找左子树中最右边的结点
			{
				temp1 = temp2, temp2 = temp2->rchild;
			}
			// 用左子树中最右边的点覆盖要删除的点
			temp->data = temp2->data;
			if(temp1 != temp2)	// 若左子树有右结点
				temp1->rchild = temp2->lchild;
			else	// 若temp左子树没有右结点
				temp->lchild = temp2->lchild;
			free(temp2);
		}
		else // 若无左子树
		{
			Node *q = temp;
			q = q->rchild;
			free(q);
			q = NULL;
		}
	}
	else
		cout<<"没有这个数,无法删除!";
}


bool Tree_Search(Node *T, int key)
{
	Node *temp = T;
	int i = 1;
	while(temp)
	{
		if(temp->data == key)
		{
			cout<<"在第"<<i++<<endl;
			return true;
		}
		else
		{
			i++;
			temp = (key < temp->data) ? (temp->lchild) : (temp->rchild);
		}
	}
	return false;
}

void Level_Print(Node *T, int level)
{
	if(!T)return;
	if(level == 1)
		cout<<T->data;
	else
	{
		Level_Print(T->lchild, level -1);
		Level_Print(T->rchild, level -1);
	}
}
	
int Level_Count(Node *T, int level)
{
	if(T == NULL || level < 1 || level > Tree_CengNum(T))
	{
		return 0;
	}
	if(level == 1)
		return 1;
	return Level_Count(T->lchild, level - 1) + Level_Count(T->rchild, level -1);
}

int Tree_CengNum(Node *T)
{
	 if(NULL==T){  
        return 0;  
    }else{  
		int lh=Tree_CengNum(T->lchild);  
        int rh=Tree_CengNum(T->rchild);  
        return (lh>rh)?(lh+1):(rh+1);  
    }  
}


int Tree_Min(Node *T)
{
	Node *temp = T;
	while(temp->lchild)
	{
		temp = temp->lchild;
	}
	return temp->data;
}

int Tree_Max(Node *T)
{
	Node *temp = T;
	while(temp->rchild)
	{
		temp = temp->rchild;	
	}
	return temp->data;
}


// 二叉排序的树的插入
Node *Tree_Insert(Node *T, int key)
{
	Node *p = T;
	Node *temp1, *temp2;
	while(p != NULL)
	{
		temp1 = p;
		if(key == p->data)
		{
			cout<<"要插入的节点已存在,不必再插入!"<<endl;
			return T;
		}
		p = (key > p->data) ? p->rchild : p->lchild;
	}
	temp2 = new Node;
	temp2->data = key;
	temp2->lchild = NULL;
	temp2->rchild = NULL;
	if(T == NULL) return temp2;
	if(key < temp1->data)
		temp1->lchild = temp2;
	else
		temp1->rchild = temp2;
	return T;
}

Node *Create()
{
	int key;
	Node *T = NULL;
	cout<<"输入节点数据值为(-1)为结束值"<<endl;
	cin>>key;
	while(key != -1)
	{
		T = Tree_Insert(T, key);
		cin>>key;
	}
	return T;
}

// 二叉排序树的中序遍历
void inOrder(Node *T)
{
	if(T)
	{
		inOrder(T->lchild);;
		cout<<T->data;
		inOrder(T->rchild);
	}
	return;
}

int main()
{
	cout<<"二叉树的构建"<<endl;
	Node *T = Create();
	cout<<"二叉树的中序遍历"<<endl;
	inOrder(T);
	cout<<"输出该二叉树的层级"<<endl;
	cout<<Tree_CengNum(T)<<endl;
	cout<<"输入要打印的层n:"<<endl;
	int n;
	cin>>n;
	cout<<endl;
	Level_Print(T, n);
	cout<<"输入要查找的结点n:";
	cin>>n;
	cout<<Tree_Search(T, n)<<endl;
	
	
	
	//打印二叉树某一层的结点个数
	cout<<"输入要打印的某层n,求该层的结点个数"<<endl;
	cin>>n;
	cout<<Level_Count(T, n)<<endl;
	//
	system("pause");
	return 0;
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值