文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

二叉树的后序遍历序列

2024-12-01 12:42

关注

思路分析

我们通过一个例子来分析这个问题,如下所示为一颗二叉树。

通过之前文章的学习(二叉树的后序遍历),我们可以很快看出这颗树的后序遍历序列为: [5, 7, 6, 9, 11, 10, 8],通过观察后我们发现最后一个数字为二叉树的根节点,数组中前面的数字可以分为两部分:

第一部分是左子树节点的值,它们都比根节点的值小

第二部分是右子树节点的值,它们都比根节点的值大

在上面的后序遍历结果数组中,前3个数字5、7、6​都比根节点8小,是它的左子树节点;后3个数字9、11、10都比根节点8大,是它的右子树节点。

那么,我们就可以用同样的方法来确定数组每一部分对应的子树的结构。

数组5, 7, 6,最后一个数字6是左子树的根节点的值。数字5比6小,是6的左子节点,7则是它的右子节点

数组9, 11, 10,最后一个数字10是左子树的根节点的值。数字9比10小,是10的左子节点,11则是它的右子节点

实现思路

通过上面的分析,我们便可以总结出实现思路了。

最后一项一定是根节点,从根节点前面的值中寻找左、右子树的分界点

定义指针leftIndex,前半部分一定是它的左子树,每个节点的值都比根节点小

leftIndex默认从0开始,逐渐递增,寻找比根节点大的值,便是它们的分界点

定义指针rightIndex,后半部分一定是它的右子树,每个节点的值都比根节点大。

rightIndex从分界点开始找(默认从leftIndex位置开始),如果有比根节点小的值,那么这个序列一定不属于二叉树的后序遍历序列

如果leftIndex指针离开了起始位置(0),证明它的左子节点还没找完,需要重复执行上述过程继续查找(递归寻找到数组的leftIndex位置)

如果leftIndex指针没有到达数组末尾,证明它的右子节点还没找完,需要重复执行上述过程继续查找(从leftIndex+1位置开始递归)

返回左、右子树的递归校验结果(两者都为true则表示这个序列为二叉树的后序遍历序列)

实现代码

捋清楚思路后,我们便可以顺利的写出代码了。

  verifySequenceOfBST(sequence: Array<number>, length: number): boolean {
if (sequence == null || length <= 0) return false;
const root = sequence[length - 1];
// 左子树节点的值小于根节点的值
let leftIndex = 0;
for (; leftIndex < length - 1; leftIndex++) {
if (sequence[leftIndex] > root) {
break;
}
}
// 右子树节点的值大于根节点的值
let rightIndex = leftIndex;
for (; rightIndex < length - 1; rightIndex++) {
if (sequence[rightIndex] < root) {
return false;
}
}

// 判断左子树是否为二叉树
let leftVerify = true;
if (leftIndex > 0) {
leftVerify = this.verifySequenceOfBST(sequence, leftIndex);
}
let rightVerify = true;
if (leftIndex < length - 1) {
rightVerify = this.verifySequenceOfBST(
sequence.slice(leftIndex + 1),
length - leftIndex - 1
);
}
return leftVerify && rightVerify;
}

测试用例

接下来我们将思路分析中所列举的例子代入上述代码,来验证下我们的代码能否正确执行。

const arr = [5, 7, 6, 9, 11, 10, 8];
console.log("比对结果", treeOperateTest.verifySequenceOfBST(arr, arr.length));

我们再列举一个错误的例子,来验证下它能否正确判断。

const arr = [7, 4, 6, 5];
console.log("比对结果", treeOperateTest.verifySequenceOfBST(arr, arr.length));

示例代码

本文用到的代码完整版请移步:

来源:神奇的程序员内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯