相关题目:
- zcmu–4933: 二叉排序树(二叉树遍历输出)
- zcmu–4932: 树查找
- zcmu–4931: 二叉树遍历(已知先序中序二叉树重建)
- pta-1020 Tree Traversals(25 分)(已知后序中序求层序二叉树遍历与重建)
思路:
二叉树的建立采用递归:给定一个指向根节点的指针,然后递归调用ceate()函数,生成二叉树。
二叉树的遍历也是递归:如果节点有数据,则按照遍历规则打印根节点和孩子节点,没有数据则返回直到所有数据都遍历完,递归结束。
如果是层序遍历:https://blog.csdn.net/qq_38735931/article/details/82081966要用到队列
下面是根据前序序列来建树,‘#’表示空,注意‘#’的数量一定要足够;
#include<bits/stdc++.h>
using namespace std;
//定义节点
typedef struct node{
struct node *lchild;
struct node *rchild;
char val;
}node,*tree; //*tree: struct node*起了个别名,叫tree,故tree为指向节点的指针
//按前序序列建立二叉树
void create(tree &T) //&即传进节点指针的引用,括号内等价于 node* &T,目的是让传递进来的指针发生改变
{
char c;cin>>c;
if(c=='#') //当遇到#时,令树的根节点为NULL,从而结束该分支的递归
{
T=NULL;
return;
}
else
{
T=new node();
T->val=c;
create(T->lchild);
create(T->rchild);
}
}
//前序遍历二叉树并打印
void preTraverse(tree T)
{
if(T)
{
cout<<T->val<<" ";
preTraverse(T->lchild);
preTraverse(T->rchild);
}
}
//中序遍历二叉树并打印
void midTraverse(tree T)
{
if(T)
{
midTraverse(T->lchild);
cout<<T->val<<" ";
midTraverse(T->rchild);
}
}
//后续遍历二叉树并打印
void postTraverse(tree T)
{
if(T)
{
postTraverse(T->lchild);
postTraverse(T->rchild);
cout<<T->val<<" ";
}
}
int main()
{
tree T; //声明一个指向二叉树根节点的指针
create(T);
cout<<"二叉树创建完成"<<endl;
cout<<"前序遍历:"<<endl;
preTraverse(T);
cout<<endl;
cout<<"中序遍历:"<<endl;
midTraverse(T);
cout<<endl;
cout<<"后序遍历:"<<endl;
postTraverse(T);
return 0;
}