剑指Offer----面试题24:二叉搜索树的后序遍历序列

来源:互联网 发布:java注释 编辑:程序博客网 时间:2024/06/06 03:36

题目:

输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。

如下图:当输入的数组为{5,7,6,9,11,10,8}时,返回true,否则返回false。



分析:

在后续遍历中,最后一个数字是树的根节点的值,数组中前面的数字可以分为两部分:第一部分是左子树的值,它们都比根节点的值要小;第二部分是右子树结点的值,它们都比根节点的值要大。

源代码如下:
#include<cstdlib>#include<cstdio>// BST:Binary Search Tree,二叉搜索树bool VerifySquenceOfBST(int sequence[], int length){if (sequence == NULL || length <= 0)return false;int root = sequence[length - 1];// 在二叉搜索树中左子树的结点小于根结点int i = 0;for (; i < length - 1; ++i){if (sequence[i] > root)break;}// 在二叉搜索树中右子树的结点大于根结点int j = i;for (; j < length - 1; ++j){if (sequence[j] < root)return false;}// 判断左子树是不是二叉搜索树bool left = true;if (i > 0)left = VerifySquenceOfBST(sequence, i);// 判断右子树是不是二叉搜索树bool right = true;if (i < length - 1)right = VerifySquenceOfBST(sequence + i, length - i - 1);return (left && right);}// ====================测试代码====================void Test(char* testName, int sequence[], int length, bool expected){if (testName != NULL)printf("%s begins: ", testName);if (VerifySquenceOfBST(sequence, length) == expected)printf("passed.\n");elseprintf("failed.\n");}//            10//         /      \//        6        14//       /\        /\//      4  8     12  16void Test1(){int data[] = { 4, 8, 6, 12, 16, 14, 10 };Test("Test1", data, sizeof(data) / sizeof(int), true);}//           5//          / \//         4   7//            ///           6void Test2(){int data[] = { 4, 6, 7, 5 };Test("Test2", data, sizeof(data) / sizeof(int), true);}//               5//              ///             4//            ///           3//          ///         2//        ///       1void Test3(){int data[] = { 1, 2, 3, 4, 5 };Test("Test3", data, sizeof(data) / sizeof(int), true);}// 1//  \//   2//    \//     3//      \//       4//        \//         5void Test4(){int data[] = { 5, 4, 3, 2, 1 };Test("Test4", data, sizeof(data) / sizeof(int), true);}// 树中只有1个结点void Test5(){int data[] = { 5 };Test("Test5", data, sizeof(data) / sizeof(int), true);}void Test6(){int data[] = { 7, 4, 6, 5 };Test("Test6", data, sizeof(data) / sizeof(int), false);}void Test7(){int data[] = { 4, 6, 12, 8, 16, 14, 10 };Test("Test7", data, sizeof(data) / sizeof(int), false);}void Test8(){Test("Test8", NULL, 0, false);}int main(){Test1();Test2();Test3();Test4();Test5();Test6();Test7();Test8();system("pause");return 0;}

运行结果:
Test1 begins: passed.Test2 begins: passed.Test3 begins: passed.Test4 begins: passed.Test5 begins: passed.Test6 begins: passed.Test7 begins: passed.Test8 begins: passed.请按任意键继续. . .

注意:

如果面试题中要求处理一颗二叉树的遍历序列,我们可以先找到二叉树的根节点,在基于根节点把整棵树的遍历序列拆分成左子树对应的子序列和右子树对应的子序列,接下来再递归处理这两个子序列。








0 0
原创粉丝点击