1、思路
二叉树的后序遍历为先左、再右、最后根的顺序,即二叉树的头节点值为数组的最后一个元素;
例如数组
[2, 1, 3, 6, 5, 7, 4],比4小的部分为[2, 1, 3],比4大的部分为[6, 5, 7],再继续递归地判断这两部分子树。
2、代码
#include <iostream>
#include <vector>
using namespace std;
bool isPostOrder(vector<int>& nums, int st, int ed)
{
if (st == ed)
{
return true;
}
//leftEnd 表示左子树最后一个节点的位置, rightBegin 表示右子树第一个节点的位置
int leftEnd = -1, rightBegin = ed;
for (int i = st; i < ed; ++ i)
{
if (nums[i] < nums[ed] ) //比最后一个元素小,说明是左子树节点
{
leftEnd = i; //标记左子树最后一个节点位置
}
else
{
if (rightBegin == ed) rightBegin = i; //标记右子树起始节点位置
}
}
if (leftEnd == -1 || rightBegin == ed) //当前节点只存在左子树或只存在右子树的情况
{
return isPostOrder(nums, st, ed - 1);
}
if (leftEnd != rightBegin - 1) //不合法的情况
{
return false;
}
//继续递归判断当前节点的左子树和右子树
return isPostOrder(nums, st, leftEnd) && isPostOrder(nums, rightBegin, ed - 1);
}
int main()
{
int n;
cin >> n;
vector<int> nums(n);
for (int i = 0; i < n; ++ i)
{
cin >> nums[i];
}
if (isPostOrder(nums, 0, n - 1))
{
cout << "true" << endl;
}
else
{
cout << "false" << endl;
}
return 0;
}

京公网安备 11010502036488号