判断整数序列是不是二元查找树的后序遍历结果

题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历结果。如果是,返回true,否则返回false。

举例:输入5、7、6、9、11、10、8,由于这个整数序列有如下的树的后序遍历结果:

                                   8   
                                 /   \
576911108   ->        6     10
                               / \    / \
                              5   7  9   11

因此返回true。

如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,所以返回false。

答:二叉树的后序遍历

#include "stdafx.h"
#include <iostream>

using namespace std;

/*                                 8 
                                 /   \
5、7、6、9、11、10、8 ->          6     10
                               / \    / \
                              5   7  9   11
*/

bool IsPostTreeTraversal(int arr[], int length)
{
    if (length <= 0 || NULL == arr)
    {
        return false;
    }
    int root = arr[length - 1];
    int m = 0;
    for (; m < length - 1; m++)
    {
        if (arr[m] > root)
        {
            break;
        }
    }
    int n = m;
    for (; n < length - 1; n++) //如果右子树小于根节点就返回false
    {
        if (arr[n] < root)
        {
            return false;
        }
    }
    int left = true;
    if (m > 0)
    {
        left = IsPostTreeTraversal(arr, m);
    }
    
    int right = true;
    if (length - m - 1 > 0)
    {
        right = IsPostTreeTraversal(arr, length - m - 1);
    }

    return (left && right);
}

int _tmain(int argc, _TCHAR* argv[])
{
    int arr[] = {5, 7, 6, 9, 11, 10, 8};
    if (IsPostTreeTraversal(arr, 7))
    {
        cout<<"true"<<endl;
    }
    else
    {
        cout<<"false"<<endl;
    }
    return 0;
}

输出界面如下:

posted @ 2012-08-21 20:27  venow  阅读(465)  评论(0编辑  收藏  举报