24. 二叉搜索树的后序遍历序列

来源:互联网 发布:手机淘宝怎么微信支付 编辑:程序博客网 时间:2024/05/18 05:25

题目描述

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

解析

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

主要代码实现

bool VerifySquenceOfBST(int sequence[], int length){    //判断传人参数的有效性    if (sequence == NULL || length <= 0)        return false;    //去根结点的值    int root = sequence[length - 1];    //查找作为左子树数组的范围,左子树的数组值都小于根结点    //退出循环时候,i指向作为右子树的数组起始位置    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");    else        printf("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(void){    Test1();    Test2();    Test3();    Test4();    Test5();    Test6();    Test7();    Test8();    system("pause");    return 0;}
0 0