问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

利用一个简单的菜单,通过菜单项进行选择,实现和完成如下功能:建立二叉树存储结构、求二叉树的前序遍历

发布网友 发布时间:2022-05-09 22:16

我来回答

1个回答

热心网友 时间:2023-10-24 14:29

全部操作都有了:
#include<iostream.h>

class BTreeNode
{int data;
BTreeNode *lchild;
BTreeNode *rchild;
public:
friend class BTree;
BTreeNode(){data=0;lchild=NULL;rchild=NULL;};
BTreeNode &operator=(const BTreeNode&);
};

class BTree
{BTreeNode *build0(int i);
int*a;int n;
protected:
BTreeNode *root;
public:
BTree(){};
BTree(int a[],int i){this->a=a;this->n=i;root=build0(1);};
void inorder(BTreeNode *t);
void inorder1(){cout<<"中序递归遍历:"<<'\t';inorder(root);cout<<endl;};
void inorder0(BTreeNode *t);
void inorder01(){cout<<"中序非递归遍历:"<<'\t';inorder0(root);cout<<endl;};
void preorder(BTreeNode *s);
void preorder1(){cout<<"前序递归遍历:"<<'\t';preorder(root);cout<<endl;};
void preorder0(BTreeNode *q);
void preorder01(){cout<<"前序非递归遍历:";preorder0(root);}
void postorder(BTreeNode *t);
void postorder1(){cout<<"后续递归遍历:"<<'\t';postorder(root);cout<<endl;};
void postorder0(BTreeNode *tree);
void postorder01(){cout<<"后序非递归遍历:";postorder0(root);cout<<endl;};
int depth(BTreeNode *t);
void depth0(){cout<<"树的层数(树高)为:"<<'\t'<<depth(root)<<endl;}
void changshu(BTreeNode*p);
void changshu1(){BTreeNode *p=root;cout<<"现在交换了左右子树!"<<endl;changshu(p);}
int leaf(BTreeNode* T);
void leaf1(){cout<<"叶子总数为:"<<'\t'<<leaf(root)<<endl;}
void prnt(BTreeNode *p,int l);
void prnt(){prnt(root,n);}
};

void BTree::prnt (BTreeNode *p,int n)
{if(p!=NULL)
{prnt(p->rchild ,n+1);
for(int i=0;i<6*(n-1);i++)cout<<" ";
cout<<"..."<<p->data <<endl;
prnt(p->lchild ,n+1);
}
};

void BTree::postorder0(BTreeNode *tree)//非递归后序遍历
{
BTreeNode *p;
BTreeNode *s[100];//用一个指针数组来用作栈
int top=-1;//下标
int mack[100];//标志数组
p=tree;
do
{
while(((p->lchild)!=NULL)&&(mack[top+1]!=2))//循环 直到让p向左滑到最左子树
{
top=top+1;
s[top]=p;//每循环一次,当前结点入栈
mack[top]=1;//结点第一次入栈时,标志为1
p=p->lchild;//找最左子树
}
cout<<p->data<<'\t'; //输出末节点 //非递归后序遍历!
p=s[top];//出栈顶元素
top=top-1;//每出一个栈顶元素,下标就后退一位
while(mack[top+1]==1)//若结点是第一次出栈,则再入栈
{
top=top+1;
s[top]=p;
mack[top]=2;//结点第二次入栈时,标志为2
p=p->rchild;//访问右子树
}
}
while(top!=-1);
cout<<s[0]->data ;
};

void BTree::preorder0(BTreeNode *q) //前序非递归遍历函数
{
BTreeNode *stack[30],*p;
int top;top=0;
//for(int i=0;i<30;i++) stack[i]=new BTreeNode;
stack[top]=root;
while(top>=0)
{
while(stack[top]!=NULL)
{
p=stack[top];
cout<<p->data<<'\t';
p=p->lchild;
stack[++top]=p;
}
top--;
if(top>=0)
{
p=stack[top];
stack[top]=p->rchild;
}
}
cout<<endl;
};

void BTree::changshu(BTreeNode *p)
{
BTreeNode *temp;
if (p == NULL) return; //交换左右子树!!!!!!
temp = NULL;
temp = p ->lchild;
p->lchild = p ->rchild;
p->rchild = temp;
changshu(p ->lchild);
changshu(p ->rchild);
};

int BTree::leaf(BTreeNode *T)
{
if(T!=NULL)
if((T->lchild==NULL)&&(T->rchild==NULL))
return 1; //求叶子总数!!!!!!
else return leaf(T->lchild )+leaf(T->rchild );
else return 0;
};

int BTree::depth(BTreeNode *t)
{if (t==NULL) return NULL;
else
return ((depth(t->lchild)+1)>(depth(t->rchild )+1)?(depth(t->lchild)+1):(depth(t->rchild )+1));
};

BTreeNode &BTreeNode::operator=(const BTreeNode &obj)
{data=obj.data;
lchild=obj.lchild;
rchild=obj.rchild;
return *this;
};

BTreeNode * BTree::build0(int i)
{int r,l;BTreeNode *p;
if((i<=n)&&(a[i-1]!=NULL))
{r=2*i+1;
l=2*i; //建二叉树
p=new BTreeNode;
p->data=a[i-1];
p->lchild=build0(l);
p->rchild=build0(r);
return (p);}
else return (NULL);
};

void BTree::inorder(BTreeNode *t)
{if(t!=NULL) //中序遍历
{inorder(t->lchild);
cout<<t->data<<'\t';//用 visit?
inorder(t->rchild);
};
};

void BTree::inorder0(BTreeNode *t)
{
int top=0;
BTreeNode *stack[10],*p;
stack[top]=t;
while(top>=0)
{ //非递归中序
while(stack[top]!=NULL)
{p=stack[top]->lchild;
stack[++top]=p;}
top--;
if(top>=0)
{p=stack[top];
cout<<stack[top]->data<<'\t';
stack[top]=p->rchild;
}
};
};

void BTree::preorder(BTreeNode *s)
{if(s!=NULL)
{cout<<s->data<<'\t';
preorder(s->lchild); //前序遍历
preorder(s->rchild);};
};

void BTree::postorder(BTreeNode *t)
{if(t!=NULL)
{postorder(t->lchild );
postorder(t->rchild );
cout<<t->data<<'\t';}; //后序遍历
};

void main()
{int x=0;int b[100];int v,i;
while(x!=1){cout<<"请选择功能,第一次必须先建立二叉树!:"<<endl<<"1--建立一棵二叉树"<<endl<<"2--前序遍历递归算法"<<endl<<"3--前序遍历非递归算"<<endl<<"4--中序遍历递归算法"<<endl<<"5--中序遍历非递归算法"<<endl;
cout<<"6--后序遍历递归算法"<<endl<<"7--后序遍历非递归算法"<<endl<<"8--求树高"<<endl<<"9--求叶子总数"<<endl<<"10--输出二叉树"<<endl<<"11--交换左右子树"<<endl<<"12--退出"<<endl;
cin>>x;}
cout<<"请输入二叉树个数:"<<endl;cin>>v;cout<<"请从逐层左到右输入二叉树:"<<endl;for(i=0;i<v;i++)cin>>b[i];cout<<"输入完成";BTree a(b,v);
while (x!=12)
{
switch(x)
{
case 2:a.preorder1 ();break;
case 3:a.preorder01();break;
case 4:a.inorder1();break;
case 5:a.inorder01();break;
case 6:a.postorder1();break;
case 7:a.postorder01();break;
case 8:a.depth0();break;
case 10:a.prnt();break;
case 9:a.leaf1();break;
case 11:a.changshu1();cout<<"交换完成!";break;
case 12:cout<<"欢迎再次使用!"<<endl;return;
};
cout<<"请再次输入需要的操作:";
cin>>x;};
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 呼伦贝尔油玉不绝电子商务有限公司怎么样? 如何避免wps卡顿? 属鼠的男人找对象是属什么,属鼠的人和什么属相合 96年鼠的姻缘在哪年 属相相合年份运势提升 2024属鼠找对象属什么最佳 黑客攻击网站能报案吗 黑客攻击报案有用吗 如何用cpu-z超频 cpu-z怎样看自己电脑cpu超频成功 我用cpu-z看 但不知道看哪里 有个总线速度230.1mhz 超频时我把哪个cpu设 利用油纸伞做研学课程可以有哪些 建立任意二叉树的二叉链表存储,并对其进行先序、中序、后序遍历。 cpu z超频的注意事项 基本要求:建立一棵二叉树,并建立二叉树的存储结构,并对其实现中序遍历(尽可能用非递归算法实现)。 CPU怎么超频哦? 哪位可以告诉下cpuz如何看超频 数据结构,建立二叉树的存储结构,先序、中序、后序遍历二叉树(要求任 ... 如何用cpu z给cpu超频 移动WLAN流量是什么意思 小天才电话手表充不上电是什么原因? 南之缘蟹黄汤包盒子可以一起蒸吗? 广州到澳门签证要多久 靖江南之缘蟹黄汤包券2019年有用吗? 想问下,现在靖江的蟹黄汤包的价钱,陈世荣的,最好详细点,有靖江人告诉我吗,谢谢!! cpu-z怎么超频 现在广州签澳门证要多久 如果根据油纸伞元素和油纸伞文化设计意见油纸伞衍生品,你想怎么做? 申请去澳门工作签证要多久? q8300怎么超频(内附cpu-z图片) 用C语言定义二叉树的二叉链表存储结构,完成二叉树的建立,先序中序后序遍历的操作,求所有叶子结点总数 新乡桶装水品牌?各占市场份额? 二叉树的链式存储结构的数据结构定义、创建、先序和后序遍历,并将结果序列输出。 新乡市 桶装水 设二叉树的存储结构为二叉链表,试写出算法(C函数):将所有结点的左右子树互换 新乡市 桶装水什么牌子最好? 听说辉县万仙山泉水不错。 1、创建一棵二叉树,以二叉链表作存储结构,实现先根遍历算法 2、创建一棵二叉树,实现先根遍历算法、中根 不锈钢桶装水喝了对身体有没有危害? 新乡市什么牌子的桶装水好? 谁知道新乡的纯净水都是什么价格 英国的货币叫英镑,法国的货币叫法郎,那么德国的货币叫什么? 刚买的笔记本电脑在那看内存这些? 德国进行货币改革有什么影响? 什么是俄国货币什么是法国货币什么是英国的货币什么是德国的货币 新闻早早报的公众号是多少? 史密斯RO膜净水器出来的水是什么水 自动挡的车怎么开? 如何上坡起步? 给新北方的照片发到哪 养珊瑚必须加纯净水吗?