Trees are fundamental in many branches of computer science. Current state-of-the art parallel computers such as Thinking Machines' CM-5 are based on fat trees. Quad- and octal-trees are fundamental to many algorithms in computer graphics.
This problem involves building and traversing binary trees.
Given a sequence of binary trees, you are to write a program that prints a level-order traversal of each tree. In this problem each node of a binary tree contains a positive integer and all binary trees have have fewer than 256 nodes.
In a level-order traversal of a tree, the data in all nodes at a given level are printed in left-to-right order and all nodes at level k are printed before all nodes at level k+1.
For example, a level order traversal of the tree
is: 5, 4, 8, 11, 13, 4, 7, 2, 1.
In this problem a binary tree is specified by a sequence of pairs (n,s) where n is the value at the node whose path from the root is given by the string s. A path is given be a sequence of L's and R's where L indicates a left branch and R indicates a right branch. In the tree diagrammed above, the node containing 13 is specified by (13,RL), and the node containing 2 is specified by (2,LLR). The root node is specified by (5,) where the empty string indicates the path from the root to itself. A binary tree is considered to be completely specified if every node on all root-to-node paths in the tree is given a value exactly once.
This problem involves building and traversing binary trees.
Given a sequence of binary trees, you are to write a program that prints a level-order traversal of each tree. In this problem each node of a binary tree contains a positive integer and all binary trees have have fewer than 256 nodes.
In a level-order traversal of a tree, the data in all nodes at a given level are printed in left-to-right order and all nodes at level k are printed before all nodes at level k+1.
For example, a level order traversal of the tree
is: 5, 4, 8, 11, 13, 4, 7, 2, 1.
In this problem a binary tree is specified by a sequence of pairs (n,s) where n is the value at the node whose path from the root is given by the string s. A path is given be a sequence of L's and R's where L indicates a left branch and R indicates a right branch. In the tree diagrammed above, the node containing 13 is specified by (13,RL), and the node containing 2 is specified by (2,LLR). The root node is specified by (5,) where the empty string indicates the path from the root to itself. A binary tree is considered to be completely specified if every node on all root-to-node paths in the tree is given a value exactly once.
All nodes contain a positive integer. Every tree in the input will consist of at least one node and no more than 256 nodes. Input is terminated by end-of-file.
(11,LL) (7,LLL) (8,R) (5,) (4,L) (13,RL) (2,LLR) (1,RRR) (4,RR) () (3,L) (4,R) ()
5 4 8 11 13 4 7 2 1 not complete题意:我们直接看图和数据,就差不多可以猜到题意了。(11,LL)LL表示从根节点一直向左的第二个节点上的数值为11;(2,LLR)从根节点向左两个节点,再向右一个节点上的数值为2,(5,)因为5后面没有其他的,所以5为根节点。最后按照层次遍历把数值输出来。
思路:我们需要根据题目要求去建立一个二叉树,(博客上要很多建立二叉树的文章,这儿就不介绍了)处理数据时,用到一些函数,可以了解(使代码更简洁)。建立完二叉树,就需要层次遍历,这时我们就需要用一个队列去维护,依次把那些分叉入队即可(代码其实很简单)。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define maxn 3000
struct Node
{
int v;
int flag;
Node *left ,*right;
};
Node* root;
Node *newnode()
{
Node* u=(Node*)malloc(sizeof(Node));
if(u!=NULL)
{
u->v = 0;
u->flag = 0;
u->left = u->right = NULL;
}
return u;
}
int faild;
Node *buile_tree(int v,char *s)
{
Node* u=root;
int n=strlen(s);
for(int i=0; i<n; i++)
{
if(s[i]=='L')
{
if(u->left==NULL)
u->left=newnode();
u=u->left;
}
else if(s[i]=='R')
{
if(u->right==NULL)
u->right=newnode();
u=u->right;
}
}
if(u->flag)
faild=1;
u->v=v;
u->flag = 1;
}
int input()
{
faild=0;
root=newnode();
char s[maxn+10];
while(1)
{
if(scanf("%s",s)==EOF) return 0;
if(!strcmp(s,"()")) return 1;
int v;
sscanf(&s[1],"%d",&v);
buile_tree(v,strchr(s,',')+1);
}
return 1;
}
int ans[maxn],top;
int bfs()
{
int head=0,tail=1;
Node* Q[maxn];
Q[0]=root;
top=0;
while(head<tail)
{
Node* u=Q[head++];
if(!u->v) return 0;
ans[top++]=u->v;
if(u->left)
Q[tail++]=u->left;
if(u->right)
Q[tail++]=u->right;
}
return 1;
}
int main()
{
while(input())
{
if(!bfs()) faild=1;
if(!faild)
{
for(int i=0; i<top-1; i++)
printf("%d ",ans[i]);
printf("%d\n",ans[top-1]);
}
else printf("not complete\n");
}
return 0;
}