欢迎访问我的Uva题解目录哦 https://blog.csdn.net/richenyunqi/article/details/81149109

题目描述

例题6-7 树的层次遍历(Trees on the level, Duke 1993, UVa 122)

题意解析

输入一棵二叉树,你的任务是按从上到下、从左到右的顺序输出各个结点的值。每个结点都按照从根结点到它的移动序列给出(L表示左,R表示右)。在输入中,每个结点的左括号和右括号之间没有空格,相邻结点之间用一个空格隔开。每棵树的输入用一对空括号“()”结束(这对括号本身不代表一个结点)。
注意,如果从根到某个叶结点的路径上有的结点没有在输入中给出,或者给出超过一次,应当输出not complete。结点个数不超过256。

算法设计

采用动态二叉链表存储整棵树,根据需要建立新的结点。注意树的结点类中应包含一个域标志是否该结点已被赋值。然后按照LR字符插入新结点,最后进行层次遍历即可。

C++代码

#include<bits/stdc++.h>
using namespace std;
struct Node{
    bool value=false;//标志该结点是否已被赋值
    int data;//数据域
    Node*left=nullptr,*right=nullptr;//左右孩子指针
};
bool f=true;//标志一个结点是否被重复赋值
void insert(int data,string s,Node*root){//插入结点
    for(auto c:s)//遍历标志结点位置的字符串
        if(c=='L'){//如果是L字符,向左子树插入
            if(root->left==nullptr)
                root->left=new Node();
            root=root->left;
        }else{//如果是R字符,向右子树插入
            if(root->right==nullptr)
                root->right=new Node();
            root=root->right;
        }
    if(root->value)//当前结点已被赋值
        f=false;//该结点被重复赋值
    root->data=data;//更新该结点数据域
    root->value=true;//该结点已被赋值
}
bool levelOrder(Node*root,vector<int>&level){//层次遍历
    queue<Node*>q;
    q.push(root);
    while(!q.empty()){
        root=q.front();
        q.pop();
        if(!root->value)//该结点没有被赋值,返回false
            return false;
        level.push_back(root->data);
        if(root->left!=nullptr)
            q.push(root->left);
        if(root->right!=nullptr)
            q.push(root->right);
    }
    return true;
}
int main(){
    string input;
    Node*root=new Node();
    while(cin>>input){
        if(input=="()"){//是空括号,一棵树已输入完成
            vector<int>level;//存储层次遍历序列
            if(f&&levelOrder(root,level)){
                for(int i=0;i<level.size();++i)
                    printf("%s%d",i>0?" ":"",level[i]);
                puts("");
            }else
                puts("not complete");
            root=new Node();
            f=true;
        }else{
            int i=input.find(',');
            insert(stoi(input.substr(1,i-1)),input.substr(i+1,input.size()-2-i),root);
        }
    }
    return 0;
}

相关文章: