#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;
}
二叉树的前中后遍历(递归与非递归)、BST插入、删除、创建、查找
最新推荐文章于 2022-01-03 20:33:27 发布
本文详细探讨了二叉树的前序、中序、后序遍历,包括递归和非递归实现,并深入讲解了二叉搜索树(BST)的插入、删除、创建和查找操作,旨在帮助读者全面理解二叉树数据结构及其应用。
摘要由CSDN通过智能技术生成