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