最优解原理
直接从前序和后序,找到后序的第一个
后序的第一个元素,必定是左下(前提有左树)
具体情况控制参照,AVL数旋转的4种叶节点情形
加上1种平衡叶节点状态——》三角形
针对以上5种情况,写一遍前中后3种遍历,
再仔细想想如何一下子找到后序第一个
你就能理解我的写法
代码
#include<bits/stdc++.h>
using namespace std;
int quantity{ 0 };
vector<int>preorder;
vector<int>inorder;
void InPut();
void PrintPostFirst(int pre_begin, int pre_end, int in_begin, int in_end);
int main() {
InPut();
PrintPostFirst(0, quantity - 1, 0, quantity - 1);
return 0;
}
void InPut() {
scanf("%d", &quantity);
preorder.resize(quantity);
inorder.resize(quantity);
for (int i = 0; i < quantity; i++)
scanf("%d", &preorder[i]);
for (int i = 0; i < quantity; i++)
scanf("%d", &inorder[i]);
}
void PrintPostFirst(int pre_begin, int pre_end, int in_begin, int in_end) {
int w = find(inorder.begin() + in_begin, inorder.begin() + in_end, preorder[pre_begin]) - inorder.begin();
int p = w - in_begin;
int q = in_end - w;
if (p == 2 || p == 1) {
printf("%d", preorder[pre_begin + p]);
return;
}
if (p > 2)
PrintPostFirst(pre_begin + 1, pre_begin + p, in_begin, w - 1);//直接左边
if (p == 0 && q == 2) {
printf("%d", preorder[pre_begin + q]);
return;
}
if (p == 0 && q > 2)
PrintPostFirst(pre_begin + p + 1, pre_end, w + 1, in_end);//万一左边没有,需要右边
}
彩蛋——测试点推测
测试点2,3为左边子树全空下,输出
测试点4是最大边界测试