题目描述
输入一个带空结点的先序遍历序列,生成一棵二叉树。用#表示空结点。 例:根结点是A,左孩子是B,右孩子是C,这样一棵二叉树的带空结点的先序遍历序列为:AB##C##
生成二叉树后,请分别输出
- 这棵二叉树的深度
- 这棵二叉树叶子结点数
- 这棵二叉树的先序遍历序列
- 这棵二叉树的中序遍历序列
- 这棵二叉树的后序遍历序列
- 这棵二叉树的层次遍历序列
输入
一行由大写字母和#组成的字符串,为带空结点的先序遍历序列。
输出
第1行:这棵二叉树的深度 第2行:这棵二叉树叶子结点数 第3行:这棵二叉树的先序遍历序列 第4行:这棵二叉树的中序遍历序列 第5行:这棵二叉树的后序遍历序列 第6行:这棵二叉树的层次遍历序列
样例输入输出
输入:ABD###CE##F##
输出:
3
3
ABDCEF
DBAECF
DBEFCA
ABCDEF
思路:
模板,无需多说
STEP 1:节点数组,指针初始指向数组开头,每个节点包含一个字符值val
和左右子节点指针
STEP 2:递归建树,“#”空节点,使用先序遍历顺序创建树(根-左-右),每次调用会消耗两个字符(左右子节点)
STEP 3:递归计算树的深度,空节点深度为0,非空节点深度为左右子树深度最大值加1
STEP 4:递归计算叶子节点:空节点返回0,左右子节点都为空的是叶子节点,返回1,否则返回左右子树叶子节点数之和
STEP 5:遍历顺序,再再再讲一遍:
-
先序:根-左-右
-
中序:左-根-右
-
后序:左-右-根
STEP 5:使用队列实现BFS层次遍历,按层次从上到下、从左到右遍历节点每个节点出队时打印值,并将其非空子节点入队
STEP 6:输入,建树,按要求输出。
代码
#include<bits/stdc++.h> #define N 105 using namespace std; struct Node { char val; Node*left,*right; }node[N],*p=node; //扩展先序遍历序列的第一个字符是v,生成一棵树,返回树根节点地址 Node*createTree(char v) { if(v=='#') { return NULL; } Node*np=++p; np->val=v; np->left=createTree(getchar()); np->right=createTree(getchar()); return np; } //二叉树深度 int getDepth(Node*r) { int le,ri; if(r==NULL) { return 0; } else { le=getDepth(r->left); ri=getDepth(r->right); return le>ri?(le+1):(ri+1); } } //二叉树叶子结点个数 int NodeNum(Node*r) { if(r==NULL) { return 0; } else if(r->left==NULL&&r->right==NULL) { return 1; } return NodeNum(r->left)+NodeNum(r->right); } //先序遍历以r为根的子树 void preOrder(Node*r) { if(r==NULL) { return; } cout<<r->val; preOrder(r->left); preOrder(r->right); } //中序遍历以r为根的子树 void inOrder(Node*r) { if(r==NULL) { return; } inOrder(r->left); cout<<r->val; inOrder(r->right); } //后序遍历以r为根的子树 void postOrder(Node*r) { if(r==NULL) { return; } postOrder(r->left); postOrder(r->right); cout<<r->val; } //树的层次遍历 void bfs(Node*v) { queue<Node*>que; que.push(v); while(!que.empty()) { Node*z=que.front(); cout<<z->val; que.pop(); Node*ch[2]={z->left,z->right}; for(int i=0;i<2;i++) { if(ch[i]!=NULL) { que.push(ch[i]); } } } } int main() { Node*root=createTree(getchar()); cout<<getDepth(root)<<"\n"; cout<<NodeNum(root)<<"\n"; preOrder(root); cout<<"\n"; inOrder(root); cout<<"\n"; postOrder(root); cout<<"\n"; bfs(root); return 0; }
运行结果
这个上主题库!!!