二叉树的层次输出

题目描述

用二叉树的带虚结点表示的前序遍历序可以唯一的确定一棵二叉树,请编程构造二叉树并按照要求输出

输入

每行是一棵二叉树的带虚结点(#)表示的前序遍历序串,长度不超过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();
      
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值