二叉树的前中后遍历(递归与非递归)、BST插入、删除、创建、查找

本文详细探讨了二叉树的前序、中序、后序遍历,包括递归和非递归实现,并深入讲解了二叉搜索树(BST)的插入、删除、创建和查找操作,旨在帮助读者全面理解二叉树数据结构及其应用。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <stack>
using namespace std;
#define len 15
typedef int ElemType;

typedef struct BiTNode  
{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode ,*BiTree;

//后续遍历,递归
void postorder(BiTree pRoot)
{
	if (pRoot==NULL)
	{
		return ;
	}
	postorder(pRoot->lchild);
	postorder(pRoot->rchild);
	cout<<pRoot->data<<" ";
}

//后续遍历非递归
void post_order(BiTree tree)
{
	if (tree==NULL)
	{
		return ;
	}
	stack<BiTree>s;
	BiTree cur=NULL,pre=NULL;
	s.push(tree);
	while(!s.empty())
	{
		cur=s.top();
		if ((cur->lchild==NULL && cur->rchild==NULL)||
			(pre!=NULL && (pre==cur->lchild || pre==cur->rchild)))
		{
			cout<<cur->data<<" ";
			s.pop();
			pre=cur;
		} 
		else
		{
			if (cur->rchild!=NULL)
			{
				s.push(cur->rchild);
			}
			if (cur->lchild!=NULL)
			{
				s.push(cur->lchild);
			}
		}
	}
}

//前序遍历,递归
void preorder(BiTree tree)
{
	if (tree!=NULL)
	{
		cout<<tree->data<<" ";
		preorder(tree->lchild);
		preorder(tree->rchild);
	}

}




//前序遍历,非递归
void pre_order(BiTree p)
{
	if (p==NULL)
	{
		return;
	}
	stack<BiTree>s;
	while(p!=NULL || !s.empty())
	{
		while(p!=NULL)
		{
			s.push(p);
			cout<<p->data<<" ";
			p=p->lchild;
		}
		if (!s.empty())
		{
			p=s.top();
			s.pop();//
			p=p->rchild;//右子树

		}
	}
}
//中序遍历递归
void midorder(BiTree tree)
{
	if (tree!=NULL)
	{
		midorder(tree->lchild);
		cout<<tree->data<<" ";
		midorder(tree->rchild);
	}
}

//中序遍历,非递归
void mid_order(BiTree p)
{
	if (p==NULL)
	{
		return;
	}
	stack<BiTree>s;
	while(p!=NULL || !s.empty())
	{
		while(p!=NULL)
		{
			s.push(p);
			p=p->lchild;
		}
		if (!s.empty())
		{
			p=s.top();
			cout<<p->data<<" ";
			s.pop();//
			p=p->rchild;//右子树

		}
	}
}

//二叉搜索树的查找,查找x所在的节点,递归
BiTree search(BiTree tree ,ElemType x)
{
	if (tree==NULL)
	{
		return NULL;
	}
	if (x>tree->data)
	{
		search(tree->rchild,x);
	}
	else if (x<tree->data)
	{
		search(tree->lchild,x);
	}
	else
		return tree;
}

//二叉树的查找,非递归
BiTree sea_rch(BiTree tree ,ElemType x)
{
	while (tree!= NULL)
	{
		if (x < tree->data)
			tree = tree->lchild;
		else if (x > tree->data)
			tree = tree->rchild;
		else
			return tree;
	}
	return NULL;
	
}

//寻找二叉搜索树的最大值,递归
BiTree findmax(BiTree tree)
{
	if (tree==NULL)
	{
		return NULL;
	}
	if (tree->rchild!=NULL)
	{
		findmax(tree->rchild);
	}
	else 
		return tree;
}
//寻找二叉树的最小值,非递归
BiTree findmin(BiTree tree)
{
	if (tree==NULL)
	{
		return NULL;
	}
	while (tree->lchild!=NULL)
	{
		tree=tree->lchild;
	}
	return tree;
}

//二叉树的插入
BiTree INS_ERT(BiTree &tree ,ElemType key)
{
	if (tree==NULL)
	{
		tree=(BiTree)malloc(sizeof(BiTNode));
		tree->data=key;
		tree->lchild=NULL;
		tree->rchild=NULL;
	}
	else if (key>tree->data)
		INS_ERT(tree->rchild,key);
	else if(key<tree->data)
		INS_ERT(tree->lchild,key);
	else
		cout<<"已存在"<<endl;
	return tree;
}

//二叉树的构造
void creat_BST(BiTree &tree ,int *a)
{
	for (int i=0;i<len;i++)
	{
		INS_ERT(tree,a[i]);
	}
}

//二叉树的删除,删除树中指定元素
void deletenode(BiTree &tree,ElemType key)
{
	if (tree==NULL)
	{
		return;
	}
	if (key>tree->data)
	{
		deletenode(tree->rchild,key);
	}
	else if (key<tree->data)
	{
		deletenode(tree->lchild,key);
	}
	else
	{
		if (tree->lchild==NULL)
		{
			BiTree tmp=tree;
			tree=tree->rchild;
			free(tmp);
		}
		else if (tree->rchild==NULL)
		{
			BiTree tmp=tree;
			tree=tree->lchild;
			free(tmp);
		}
		else
		{
			BiTree tmp1,tmp;
			tmp1=tree;
			tmp=tree->lchild;
			while(tmp->rchild!=NULL)
			{
				tmp1=tmp;
				tmp=tmp->rchild;
			}
			tree->data=tmp->data;
			if (tmp1!=tree)
			{
				tmp1->rchild=tmp->lchild;
			}
			else
			{
				tmp1->lchild=tmp->lchild;
			}
			free(tmp);
		}
	}
}

int main()
{
	int a[len]={62, 88, 58, 47, 35, 73, 51, 99, 37, 93, 23, 27, 45, 21, 12};
	BiTree tree=NULL;

	//创建一个二叉树
	creat_BST(tree,a);
	//中前后递归、非递归遍历
	cout<<"递  归中序遍历:";
	midorder(tree);
	cout<<endl;

	cout<<"非递归中序遍历:";
	mid_order(tree);
	cout<<endl<<endl;;

	cout<<"递  归前序遍历:";
	preorder(tree);
	cout<<endl;

	cout<<"非递归前序遍历:";
	pre_order(tree);
	cout<<endl<<endl;

	cout<<"递  归后序遍历:";
	postorder(tree);
	cout<<endl;
	
	cout<<"非递归后序遍历:";
	post_order(tree);
	cout<<endl<<endl;

	//删除节点
	deletenode(tree,47);
	cout<<"删除后中序遍历:";
	mid_order(tree);
	cout<<endl<<endl;

	//插入节点
	INS_ERT(tree,100);
	cout<<"添加后中序遍历:";
	mid_order(tree);
	cout<<endl<<endl;

	//查找递归
	BiTree snode=search(tree, 23);
	if (snode == NULL)
		cout <<"查找的节点不存在" <<endl;
	else
	{
		if (snode->lchild == NULL && snode->rchild == NULL)
			cout << "节点" <<snode->data<<"叶子节点"<< endl;
		else if (snode->lchild != NULL && snode->rchild == NULL)
			cout << "节点" << snode->data<<"的左节点是"<<snode->lchild->data << endl;
		else if (snode->lchild == NULL && snode->rchild != NULL)
			cout << "节点" << snode->data << "的左节点是" << snode->rchild->data << endl;
		else
			cout << "节点" << snode->data << "的左节点是" << snode->lchild->data 
			<<" ,右节点是"<<snode->rchild->data<< endl;
	}

	snode=sea_rch(tree, 23);
	if (snode != NULL)
		cout << snode->data << endl;
	else
		cout << "查找节点不存在" << endl;

	snode = findmax(tree);
	if (snode != NULL)
		cout <<"最大值为" <<snode->data << endl;
	else
		cout << "树为空" << endl;

	snode = findmin(tree);
	if (snode != NULL)
		cout << "最小值为" << snode->data << endl;
	else
		cout << "树为空" << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值