#include <bits/stdc++.h>
using namespace std;
int n;
int pre[100000], in[100000];
struct TreeNode {
int data;
TreeNode *left;
TreeNode *right;
}tree[100000];
int loc = 0;
TreeNode* creat()
{
tree[loc].left = tree[loc].right = NULL;
return &tree[loc++];
}
TreeNode* recre(int pre0, int pre1, int in0, int in1)
{
TreeNode* p = creat();
p -> data = pre[pre0];
int rootin;
for (int i = in0; i <= in1; i++)
{
if (pre[pre0] == in[i]){
rootin = i;
break;
}
}
int nl, nr;
nl = rootin - in0;
nr = in1 - rootin;
int prel0 = pre0 + 1;
int prel1 = pre0 + nl;
int inl0 = in0;
int inl1 = rootin - 1;
int prer0 = pre0 + nl + 1;
int prer1 = pre1;
int inr0 = rootin + 1;
int inr1 = in1;
if (rootin != in0) {
p -> left = recre(prel0, prel1, inl0, inl1);
}
if (rootin != in1){
p -> right = recre(prer0, prer1, inr0, inr1);
}
return p;
}
int height(TreeNode* t)
{
if (t == NULL) return 0;
else {
int m = height(t -> left);
int n = height(t -> right);
return (m > n)? m + 1:n + 1;
}
}
int leafCount(TreeNode* t)
{
if (t == NULL) return 0;
else if (!t -> left && !t -> right) return 1;
else return (leafCount(t -> left) + leafCount(t -> right));
}
void postorder(TreeNode* t)
{
if (t == NULL)
return;
else {
postorder(t -> left);
postorder(t -> right);
cout << t -> data << " ";
}
}
int main()
{
TreeNode* T;
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> pre[i];
}
for (int i = 1; i <= n; i++)
{
cin >> in[i];
}
T = recre(1, n, 1, n);
cout << height(T) << endl;
cout << leafCount(T) << endl;
postorder(T);
return 0;
}
(c++)数组实现前序中序重构二叉树,输出结点个数,树的高度以及后序遍历结果
最新推荐文章于 2023-03-14 14:38:50 发布