7-10二分木の再構築(10ポイント)

二分木のミドルルートシーケンスとバックルートシーケンスを前提として、バイナリツリーを作成し、その高さと最初のルートシーケンスを計算し、最後にバイナリツリーを削除するプログラムを作成してください。指定されたミドルルートとバックルートシーケンスが不正な場合、それも識別できます。

入力形式:
入力は2行の文字列で、最初の行は二分木のルート後のシーケンスを表し、2番目の行は二分木のルートシーケンスを表します。ノード値はすべてAZの大文字であるため、バイナリツリーノードの数は26を超えず、2つの入力シーケンスはノードの完全な配置であることが保証されますが、必ずしも正当なミドルルートとバックルートのシーケンスである必要はありません。

出力形式:
入力シーケンスが不正な場合(同じツリーのミドルルートシーケンスとバックルートシーケンスではない)、INVALIDが出力されます。入力シーケンスが有効な場合、出力は2行です。最初の行は二分木の高さを表す整数で、2番目の行は二分木のルートシーケンスを表す文字列です。

入力例1:

CEFDBHGA
CBEDFAGH

出力例1:

3
ABCDEFGH

入力例2:

CBEDFAGH
CEFDBHGA

出力例2:

無効

入力例3:

BCA
CAB

出力サンプル3:

無効

コードは少し冗長です。T_Tは木の高さを1つ下げることに注意を払っていると思います。
#include <iostream>
using namespace std;

typedef struct Node {
    
    
    char data;
    struct Node *left, *right;
} Node, *Tree;
//递归判断序列是否合法,若合法,则左右子树结点个数和相应字符也应该相等
bool judge(string a, string b) {
    
     
    if (a.length() == 0 && b.length() == 0)
        return true;
    if (a.length() != b.length())
        return false;
    char ch = a[a.length() - 1];
    int i;
    for (i = 0; i < b.length(); i++) {
    
    
        if (ch == b[i])
            break;
    }
    string aleft = a.substr(0, i);
    string aright = a.substr(i, a.length() - 1 - i);
    string bleft = b.substr(0, i);
    string bright = b.substr(i + 1);
    for (i = 0; i < aleft.length(); i++) {
    
    
        if (bleft.find(aleft[i]) == -1)
            return false;
    }
    for (i = 0; i < aright.length(); i++) {
    
    
        if (bright.find(aright[i]) == -1)
            return false;
    }
    return judge(aleft, bleft) && judge(aright, bright);
}
//建立二叉树
Tree create(char *post, char *in, int n) {
    
    
    if (n < 1)
        return NULL;
    Tree tree = (Tree)malloc(sizeof(Node));
    tree->data = post[n - 1];
    tree->left = tree->right = NULL;
    int i;
    for (i = 0; i < n; i++) {
    
    
        if (post[n - 1] == in[i])
            break;
    }
    tree->left = create(post, in, i);
    tree->right = create(post + i, in + i + 1, n - i - 1);
    return tree;
}
//得到二叉树高度
int geth(Tree tree) {
    
    
    if (!tree)
        return 0;
    int left = geth(tree->left);
    int right = geth(tree->right);
    return (left > right ? left : right) + 1;
}
//先序遍历
void preorder(Tree tree) {
    
    
    if (!tree)
        return;
    printf("%c", tree->data);
    preorder(tree->left);
    preorder(tree->right);
}
//递归删除二叉树
void deletetree(Tree tree) {
    
    
    if (!tree)
        return;
    deletetree(tree->left);
    deletetree(tree->right);
    free(tree);
}

int main() {
    
    
    string a, b;
    cin >> a >> b;
    if (!judge(a, b))
        printf("INVALID");
    else {
    
    
        int n = a.length();
        char post[30], in[30];
        int p = 0;
        for (int i = 0; i < n; i++)
            post[p++] = a[i];
        p = 0;
        for (int i = 0; i < n; i++)
            in[p++] = b[i];
        Tree tree = create(post, in, n);
        printf("%d\n", geth(tree) - 1);//如果不减一,输出4,这个题应该是按照只有一个结点时,树高为0来的
        preorder(tree);
        deletetree(tree);
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_45845039/article/details/113581547