• 1366:二叉树输出(btout)


    【题目描述】

    树的凹入表示法主要用于树的屏幕或打印输出,其表示的基本思想是兄弟间等长,一个结点的长度要不小于其子结点的长度。二叉树也可以这样表示,假设叶结点的长度为1,一个非叶结点的长度等于它的左右子树的长度之和。

    一棵二叉树的一个结点用一个字母表示(无重复),输出时从根结点开始:

    每行输出若干个结点字符(相同字符的个数等于该结点长度),

    如果该结点有左子树就递归输出左子树;

    如果该结点有右子树就递归输出右子树。

    假定一棵二叉树一个结点用一个字符描述,现在给出先序和中序遍历的字符串,用树的凹入表示法输出该二叉树。

    【输入】

    两行,每行是由字母组成的字符串(一行的每个字符都是唯一的),分别表示二叉树的先序遍历和中序遍历的序列。

    【输出】

    行数等于该树的结点数,每行的字母相同。

    【输入样例】

    ABCDEFG
    CBDAFEG

    【输出样例】

    AAAA
    BB
    C
    D
    EE
    F
    G

    #include <bits/stdc++.h>
    using namespace std;
    
    struct Node {
        char value;
        Node *left, *right;
        int length; // 长度 
    };
    
    Node *CreateTree(const string &pre, const string &in)
    {
        if (pre.size() <= 0) {
            return NULL;
        } else {
            // cout << pre << "," << in << endl;
            Node *root = new Node;
            root->value = pre[0];
            int pos = in.find(pre[0]);
            string pre1 = pre.substr(1, pos);
            string in1 = in.substr(0, pos);
            root->left = CreateTree(pre1, in1);
            string pre2 = pre.substr(pos + 1);
            string in2 = in.substr(pos + 1);
            root->right = CreateTree(pre2, in2);
            return root;
        }
    }
    
    int PostOrder(Node *root)
    {
        int len = 0;
        if (root != NULL) {
            if (root->left == NULL && root->right == NULL ) {
                len = 1; // 叶子节点 
            } else { // 非叶子节点 
                len += PostOrder(root->left);
                len += PostOrder(root->right);
            } 
            root->length = len;
        }
        return len;
    }
    
    void PreOrder(Node *root)
    {
        if (root != NULL) {
            for (int i = 0; i < root->length; i++) {
                cout << root->value;
            }
            cout << endl;
            PreOrder(root->left);
            PreOrder(root->right);
        }
    }
    
    int main()
    {
        // freopen("1.txt", "r", stdin);
        string pre = "ABCDEFG", in = "CBDAFEG";
        cin >> pre >> in;
        Node *root = CreateTree(pre, in);
        PostOrder(root);
        PreOrder(root);
        return 0;
    }
  • 相关阅读:
    centos 配置静态ip
    mysql常用命令
    mac 安装好mysql后密码重置
    安装Intellij Idea14/15
    freemarker 学习一 入门小例子
    获取类路径
    mysql中的int smallint 取值范围
    MySQL按照汉字的拼音排序
    Log4j 基本配置
    追加写入
  • 原文地址:https://www.cnblogs.com/gaojs/p/14942523.html
Copyright © 2020-2023  润新知