poj1577 Falling Leaves

题目:

Description


Figure 1
Figure 1 shows a graphical representation of a binary tree of letters. People familiar with binary trees can skip over the definitions of a binary tree of letters, leaves of a binary tree, and a binary search tree of letters, and go right to The problem. A binary tree of letters may be one of two things: It may be empty.
It may have a root node. A node has a letter as data and refers to a left and a right subtree. The left and right subtrees are also binary trees of letters.
In the graphical representation of a binary tree of letters: Empty trees are omitted completely.
Each node is indicated by Its letter data,
A line segment down to the left to the left subtree, if the left subtree is nonempty,
A line segment down to the right to the right subtree, if the right subtree is nonempty.
A leaf in a binary tree is a node whose subtrees are both empty. In the example in Figure 1, this would be the five nodes with data B, D, H, P, and Y. The preorder traversal of a tree of letters satisfies the defining properties: If the tree is empty, then the preorder traversal is empty.
If the tree is not empty, then the preorder traversal consists of the following, in order The data from the root node,
The preorder traversal of the root's left subtree,
The preorder traversal of the root's right subtree.

The preorder traversal of the tree in Figure 1 is KGCBDHQMPY. A tree like the one in Figure 1 is also a binary search tree of letters. A binary search tree of letters is a binary tree of letters in which each node satisfies: The root's data comes later in the alphabet than all the data in the nodes in the left subtree. The root's data comes earlier in the alphabet than all the data in the nodes in the right subtree. The problem: Consider the following sequence of operations on a binary search tree of letters Remove the leaves and list the data removed Repeat this procedure until the tree is empty Starting from the tree below on the left, we produce the sequence of trees shown, and then the empty tree

by removing the leaves with data BDHPY CM GQ K Your problem is to start with such a sequence of lines of leaves from a binary search tree of letters and output the preorder traversal of the tree.

Input
The input will contain one or more data sets. Each data set is a sequence of one or more lines of capital letters. The lines contain the leaves removed from a binary search tree in the stages described above. The letters on a line will be listed in increasing alphabetical order. Data sets are separated by a line containing only an asterisk ('*'). The last data set is followed by a line containing only a dollar sign ('$'). There are no blanks or empty lines in the input.
Output
For each input data set, there is a unique binary search tree that would produce the sequence of leaves. The output is a line containing only the preorder traversal of that tree, with no blanks.
Sample Input
BDHPY
CM
GQ
K

AC
B
$
Sample Output
KGCBDHQMPY
BAC

这题目,一眼看去,感觉一脸懵逼。自己的英语本身就没那么好,哎。。。
但是仔细分析题目,感觉也不是想象中的那么难。
题目中第一张图片,我们都能明显地看出这是一棵二叉树,而且有点儿像一棵二叉搜索树(每个根节点的左子树的值都不大于自己,右子树的值都不小于自己,此处依据字典序)。
题目描述的前面部分实际上就是在向我们介绍二叉树的定义。
后面就是向我们介绍这道题的操作过程:每次将这棵二叉树的叶子节点删除,最后只剩余根节点,而且这道题描述时也说明了这棵树是二叉搜索树。而问题是:给你每一次删除的叶子节点的字符(一行代表当前树中,这些节点是叶子节点),之后让你还原这棵二叉搜索树,并且输出它的先序遍历(题目中给出了先序遍历的方法)。

开始时候我并不知道该怎么解决,后来我发现:只要将输入的序列反向建立二叉搜索树即可。但是原理我不太明白,后来看了网上牛人们的博客之后,我大概懂了一点:如果按照题目中的要求,每次删除叶子节点,然后继续删除叶子节点。到最后,根节点肯定是最后一个被删除,而子节点一定会先于自己的父节点被删除且同一级的叶子之间也没有父子关系。如果我们倒着建立二叉搜索树,那么我们就可以还原节点之间的父子关系,最终能够还原这棵树。

参考代码:

#include <iostream>
#include <cstring>
using namespace std;
const int N = 100000+10;

struct Node {
    char val;
    Node *lch;
    Node *rch;
};
char str[N];

Node* insertNode(Node *p, char ch) {
    if (p == NULL) {
        Node *q = new Node();
        q->val = ch;
        q->lch = q->rch = NULL;
        return q;
    }
    else {
        if (ch < p->val) p->lch = insertNode(p->lch, ch);
        else p->rch = insertNode(p->rch, ch);
        return p;
    }
}

void preVisit(Node *p) {
    if (p) {
        if (p->val != NULL) cout << p->val;
        preVisit(p->lch);
        preVisit(p->rch);
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    char ch;
    int i = 0;
    while (cin >> ch) {
        if (ch != '*' && ch != '$') {
            str[i] = ch;
            ++i;
        }
        else {
            Node *root = new Node();
            //for (int j = i-1;j >= 0;--j) {
            //  cout << str[j];
            //}
            //cout << endl;
            for (int j = i-1;j >= 0;--j) {
                insertNode(root, str[j]);
            }
            preVisit(root);
            cout << endl;
            delete root;
            i = 0;
            memset(str, 0, sizeof(str));
            if (ch == '$') break;
        }
    }
    return 0;
}

这道题虽然解法就是建立二叉搜索树然后进行先序遍历,但实际上无论是对题目的理解还是对解法的理解,都是有一点儿难度的。还得再研究研究。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,724评论 0 33
  • xcode7以后,包括xcode7,以tbd后缀的库为等价于以前的dylib 导航条中有两张图片,一个是背景图片,...
    CoderZb阅读 126评论 0 0
  • 每次生气的时候告诉自己,每当你想批评别人的时候,想想不是每个人都拥有你所有的那些优秀的条件。 我崇拜的柯南都是个音...
    卖糖果的小女巫阅读 157评论 0 0
  • 一个人安静的不被打扰的时间变得弥足珍贵,所以开始很喜欢周末 而且是不做社交浪费的周末,但会很愿意去参加有内容意义的...
    TS小西阅读 167评论 0 1