本文共 1363 字,大约阅读时间需要 4 分钟。
后序遍历(Postorder Traversal)是指遍历树的顺序为“左、右、根”。在二叉搜索树(Binary Search Tree, BST)中,这种遍历方式能够验证某个序列是否为二叉搜索树的后序遍历。根据定义:
通过递归的方式,可以验证所有子树的正确性(即其后序遍历是否满足二叉搜索树定义)。若所有子树都正确,则该序列即为二叉搜索树的后序遍历。
递归函数 recur(postorder, i, j) 用于验证给定区间 [i, j] 是否为二叉搜索树的后序遍历序列。以下是递归逻辑:
当 i >= j 时,说明此子树节点数量≤1,无需判别正确性,直接返回 true。
划分左右子树:
i 开始,找到第一个大于根节点值的节点,索引记为 m。[i, m-1],右子树区间为 [m, j-1],根节点索引为 j。判断是否为二叉搜索树:
[i, m-1] 内的所有节点都应小于 postorder[j]。由于划分左右子树时已经保证左子树区间的正确性,只需验证右子树区间 [m, j-1] 是否满足条件。postorder[j]。实现方式是遍历区间,当遇到≤ postorder[j] 的节点时,立即跳出,返回 false。返回值:
true;否则返回 false。boolean recur(int[] postorder, int i, int j) { if (i >= j) { return true; } int p = i; // 找到第一个大于根节点的值的索引 while (postorder[p] < postorder[j]) { p++; } int m = p; // 找到第一个等于或大于根节点的值的索引 while (postorder[p] > postorder[j]) { p++; } // 判断根节点是否正确,左子树和右子树是否正确 return p == j && recur(postorder, i, m - 1) && recur(postorder, m, j - 1);} @Testpublic void test() { boolean b = verifyPostorder(new int[]{1, 3, 2, 6, 5});} recur(i, j) 减去一个根节点,最坏情况下(树退化为链表)每轮递归都需要遍历所有节点。N。上述代码实现了后序遍历序列的验证逻辑。通过递归划分左右子树并验证其正确性,确保所有子树都符合二叉搜索树的定义。
转载地址:http://blhfk.baihongyu.com/