题目描述
用二叉树的带虚结点表示的前序遍历序可以唯一的确定一棵二叉树,请编程构造二叉树并按照要求输出
输入
每行是一棵二叉树的带虚结点(#)表示的前序遍历序串,长度不超过1000。每个结点为一个小写字母或一个数字(大于等于0,小于等于9)。
输出
对每行输入,按照前序输出对应二叉树。每个节点单独占一行,根节点为第0层,每i层多输出2*i个空格后再输出节点。如果一个节点只有一个子节点,则另一个空的子节点需要输出#
如果是一个空的二叉树,直接输出空行。
样例输入 复制
ab##c##
#
ab###
样例输出 复制
a
b
c
a
b
#
思路:首先我们创建一个带有“#”的二叉树的,接着我们在结构体中加入一个记录层数的变量,这样在建树的过程中直接给出深度。同时我们还需要在结构体中增加lflag和rflag以判断某一根节点的左右子树是否都存在,并以此来判断是否在输出过程中要加“#”。需要的变量给出来了,其中的难点就是如何标记出左右子树的存在情况。这时,我们可以利用几种遍历中的层次遍历,因为这种方式是以根节点----》左子树----〉右子树的方式遍历的,以此来标记出子树存在情况,并在之后遍历时按照要求输出即可
代码:
#include<bits/stdc++.h> using namespace std; char c; struct bintree_node { char str; struct bintree_node * ltree,*rtree; int ans=0; int lflag=0,rflag=0;//一个1一个0; }; void Create_bintree(struct bintree_node * &tree,int flag,int ans)//创建有#的二叉树 { if(flag) { cin>>c; } else { flag=1; } if(c=='\n') { return ; } else { tree=new bintree_node; tree->ans=ans; tree->str=c; if(c!='#') { Create_bintree(tree->ltree,flag,ans+1); Create_bintree(tree->rtree,flag,ans+1); } else { tree->ltree=NULL; tree->rtree=NULL; } } } void pre_traveler(struct bintree_node * tree) { if(tree!=NULL) { printf("%c",tree->str); pre_traveler(tree->ltree); pre_traveler(tree->rtree); } } void pre_bin(struct bintree_node * tree)//输出 { if(tree!=NULL) { // cout<<tree->str<<' '<<tree->lflag<<' '<<tree->rflag<<endl; // cout<<tree->str; if(((tree->lflag==1&&tree->rflag==0)||(tree->lflag==0&&tree->rflag==1))&&tree->str=='#') { for(int i=0;i<(tree->ans)*2;i++) { cout<<' '; } cout<<'#'; cout<<endl; } else if(((tree->lflag==1&&tree->rflag==0)||(tree->lflag==0&&tree->rflag==1))&&tree->str!='#') { for(int i=0;i<(tree->ans)*2;i++) { cout<<' '; } cout<<tree->str; cout<<endl; } else if(tree->str!='#') { for(int i=0;i<(tree->ans)*2;i++) { cout<<' '; } cout<<tree->str; cout<<endl; } pre_bin(tree->ltree); pre_bin(tree->rtree); } } void level_traveler(struct bintree_node * tree)//中序遍历标记子树存在情况 { if(tree==NULL) { //printf("\n"); return ; } struct bintree_node * node; queue<bintree_node *>s; s.push(tree); while(!s.empty()) { //cout<<s.front()->str<<endl; node=s.front(); //cout<<endl; //cout<<s.front()->str<<endl; if(tree->ltree!=NULL&&tree->rtree!=NULL) { //cout<<111<<endl; if((node->ltree->str!='#')&&(node->rtree->str!='#')) { s.push(node->ltree); s.push(node->rtree); node->ltree->lflag=1; node->ltree->rflag=1; node->rtree->lflag=1; node->rtree->rflag=1; } else if((node->ltree->str=='#')&&(node->rtree->str!='#')) { s.push(node->rtree); node->ltree->rflag=1; node->rtree->rflag=1; } else if((node->ltree->str!='#')&&(node->rtree->str=='#')) { s.push(node->ltree); node->ltree->lflag=1; node->rtree->lflag=1; } } s.pop(); } //cout<<"finish!"<<endl; } int Destroy_bintree(bintree_node * &tree)//销毁 { if(tree==NULL) return 0; Destroy_bintree(tree->ltree); Destroy_bintree(tree->rtree); delete tree; tree=NULL; return 0; } int main() { while(cin>>c) { int flag=0; bintree_node *tree; if(c=='#') cout<<endl; else{ flag=0; Create_bintree(tree,flag,0); // pre_traveler(tree); //pre_bin(tree); level_traveler(tree); //cout<<11111<<endl; pre_bin(tree); } getchar(); } }