跳转至

DS二叉树——二叉树之父子结点

时间限制: 1 Sec 内存限制: 128 MB

题目描述

给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构。

编写程序输出该树的所有叶子结点和它们的父亲结点

DS-1216.bmp

输入

第一行输入一个整数t,表示有t个二叉树

第二行起,按照题目表示的输入方法,输入每个二叉树的先序遍历,连续输入t行

输出

第一行按先序遍历,输出第1个示例的叶子节点

第二行输出第1个示例中与叶子相对应的父亲节点

以此类推输出其它示例的结果

样例输入

1
2
3
4
3
AB0C00D00
AB00C00
ABCD0000EF000

样例输出

1
2
3
4
5
6
C D 
B A 
B C 
A A 
D F 
C E

提示

解决方案

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include <iostream>
#include <string>
#include <vector>

class Tree {
public:
    Tree() : root_(NULL) {}
    void assign(std::string &string) {
        int index = 0;
        assign(string, index, root_, NULL);
    }
    void printlnLeavesAndFathers() {
        printlnLeavesAndFathers(root_);
        printVector(leaves_);
        printVector(fathers_);
    }
private:
    struct Node {
        char data;
        Node *left, *right;
        Node *father;
        Node() : data(0), left(NULL), right(NULL), father(NULL) {}
        Node(const char data) : data(data), left(NULL), right(NULL), father(NULL) {}
    };
    Node *root_;
    void assign(std::string &string, int &index, Node *&node, Node *pre) {
        const char data = string[index++];
        if (data != '0') {
            node = new Node(data);
            node->father = pre;
            assign(string, index, node->left, node);
            assign(string, index, node->right, node);
        } else {
            node = NULL;
        }
    }
    std::vector<char> leaves_, fathers_;
    void printlnLeavesAndFathers(Node *node) {
        if (node) {
            if (node->left == NULL && node->right == NULL) {
                leaves_.push_back(node->data);
                fathers_.push_back(node->father->data);
            }
            printlnLeavesAndFathers(node->left);
            printlnLeavesAndFathers(node->right);
        }
    }
    template <typename T>
    static void printVector(const std::vector<T> &vector) {
        for (int i = 0; i < vector.size(); ++i) {
            std::cout << vector[i] << ' ';
        }
        std::cout << std::endl;
    }
};

int main() {
    int ctrl;
    std::cin >> ctrl;

    while (ctrl--) {
        std::string string;
        std::cin >> string;
        class Tree tree;
        tree.assign(string);
        tree.printlnLeavesAndFathers();
    }

    return 0;
}

评论