对于给定的二叉树,输出其先序序列、中序序列、后序序列并输出叶子结点数。
输入格式:
二叉树的先序遍历序列。
提示:一棵二叉树的先序序列是一个字符串,若字符是‘#’,表示该二叉树是空树,否则该字符是相应结点的数据元素。
输出格式:
若是非空二叉树,则输出四行内容 第一行是二叉树的先序遍历序列; 第二行是二叉树的中序遍历序列; 第三行是二叉树的后序遍历序列; 第四行是叶子结点数;
若是空二叉树 只需输出叶子数0
输入样例1:
FCA##DB###EHM###G##
输出样例1:
FCADBEHMG
ACBDFMHEG
ABDCMHGEF
4
输入样例2:
#
输出样例2:
0
思路:根据前序遍历建好二叉树,接着前序遍历,中序遍历,后序遍历,当一个节点的左右孩子都为NULL时,该节点为叶节点。
注:树的三种遍历方式的时间复杂度都为O(n)
#include<bits/stdc++.h>
using namespace std;
typedef struct Node
{
char date;
struct Node *lchild;
struct Node *rchild;
} TreeNode,*Tree;
int ans;
void createtree(Tree &T)//引用
{
char c;
cin>>c;
if(c=='#')
{
T=NULL;
}
else
{
T=new TreeNode;//建根节点
T->date=c;
createtree(T->lchild);//建左子树
createtree(T->rchild);//建右子树
if(T->lchild==NULL&&T->rchild==NULL)ans++;
}
}
void preTraverse(Tree T)
{
if(T==NULL)return;
else
{
cout<<T->date;
preTraverse(T->lchild);
preTraverse(T->rchild);
}
}
void midTraverse(Tree T)
{
if(T==NULL)return;
else
{
midTraverse(T->lchild);
cout<<T->date;
midTraverse(T->rchild);
}
}
void postTraverse(Tree T)
{
if(T==NULL)return;
else
{
postTraverse(T->lchild);
postTraverse(T->rchild);
cout<<T->date;
}
}
int main()
{
Tree root;
createtree(root);
if(root)
{
preTraverse(root);
cout<<endl;
midTraverse(root);
cout<<endl;
postTraverse(root);
cout<<endl;
cout<<ans<<endl;
}
else//只输入了一个'#'
cout<<ans<<endl;
return 0;
}