参考代码
先存着吧,以后再慢慢理解,稍微加了一点注释。
柳神代码
利用前序和后序判断这颗二叉树是否唯一,输出任一中序遍历。
主要是左右子树的划分。
除了叶子节点外,只有一个孩子节点则会导致不唯一。
#include <iostream>
#include <vector>
using namespace std;
vector<int> in, pre, post;
bool unique = true;
//前序: 根左右
//后序: 左右根
//当左右子树退化为只有左或者只有右时,则不唯一
void getIn(int preLeft, int preRight, int postLeft, int postRight) {
if(preLeft == preRight) {
in.push_back(pre[preLeft]);
return;
}
if (pre[preLeft] == post[postRight]) {
int i = preLeft + 1; //在前序中找后序的右孩子
while (i <= preRight && pre[i] != post[postRight-1]) i++; //i是右孩子的起点
if (i - preLeft > 1) //有左孩子存在
{
int numL = i - preLeft - 1;
getIn(preLeft + 1, i - 1, postLeft, postLeft + numL - 1); //递归处理左子树
}
else //无左孩子存在则不唯一
unique = false;
in.push_back(post[postRight]); //放入根节点
getIn(i, preRight, postLeft + (i - preLeft - 1), postRight - 1); //递归处理右子树
}
}
int main() {
int n;
scanf("%d", &n);
pre.resize(n), post.resize(n);
for (int i = 0; i < n; i++)
scanf("%d", &pre[i]);
for (int i = 0; i < n; i++)
scanf("%d", &post[i]);
getIn(0, n-1, 0, n-1);
printf("%s\n%d", unique == true ? "Yes" : "No", in[0]);
for (int i = 1; i < in.size(); i++)
printf(" %d", in[i]);
printf("\n");
return 0;
}