判断整数序列是不是二叉查找树(BST)的后序遍历结果

里沿用传统二叉查找树(BST)的概念:所有左子树都小于根,右子树都大于根。(不止是直接孩子,还有间接孩子!)

现在给出一个整数序列,要求判断它是否是一棵二叉查找树BST的后序遍历结果。

如果去掉BST这个条件,我们一般是不能只根据后序遍历结果来确定某一棵树的。

有了BST这个条件后,我们可以这么做:

定义如下递归函数头:

1 intjudge(int* arr, intstart,intend)

(1)另root = end-1,则arr[root]为从start开始,end结束的子树的根(后序遍历么!)

(2)我们另i从start开始,一直++,直到碰到第一个arr[i]大于arr[root]的,那么此时的i已经位于右子树了。从start~i-1是左子树。

(3)显然从i~end-2是右子树,我们检查这段arr[j],如果有发现<arr[root]的,直接返回false。(右子树必须都大于根!)

(4)递归检查左子树 judge(arr, start, i-1) 和右子树 judge(arr, i, end-2)。如果某一个judge返回0,那么返回0,两个都1返回1。

(5)如果start==end时候,或者arr==NULL时(空树也是BST的一种!),可以直接返回

定义:二叉排序树(Binary Sort Tree)又称二叉查找树。 它或者是一棵空树;或者是具有下列性质的二叉树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二叉排序树。



/**
 * Created by renshuang on 10/11/13.
 */
public class BinarySortTree {



    public static void main(String args[]){
        int[] a = {5,7,6,9,11,10,8};
        System.out.println(verfyBst(a,0,a.length));
        int[] b = {7,4,6,5};
        System.out.println(verfyBst(b,0,b.length));
    }



    public static boolean verfyBst(int[] data,int start,int end){
        if (data == null || start > end) {
            return false;
        }
        if (start == end) {
            return true;
        }

        int root = data[end - 1];

        int i = start;
        for (; i < end - 1; i++) {

            if (data[i] >= root) {
                break;
            }
        }

        int j = i;
        for (; j < end - 1; j++) {
            if (data[j] < root) {
                return false;
            }
        }
        return verfyBst(data, start, i) && verfyBst(data, i, end - 1);
    }
}



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二元查找树也被称为二叉搜索树,是一种特殊的二叉树,其左子树中所有节点的值小于根节点的值,右子树中所有节点的值大于根节点的值。后序遍历的顺序是:左子树 -> 右子树 -> 根节点。 判断一个整数序列是否为二元查找树的后序遍历,可以分为以下步骤: 1. 读入整数序列,存储到数组中。 2. 判断数组是否为空或者长度为0,如果是则不是二元查找树的后序遍历,直接返回 false。 3. 找到根节点,即数组的最后一个元素。 4. 在数组中找到第一个大于根节点的元素,其位置为分界点,分界点左边的元素都属于左子树,右边的元素都属于右子树。 5. 递归判断左子树和右子树是否也是二元查找树的后序遍历。 下面是一份示例代码: ```c #include <stdio.h> #include <stdbool.h> bool is_bst_postorder(int *nums, int length) { if (nums == NULL || length <= 0) { return false; } // 找到根节点 int root = nums[length - 1]; // 找到分界点 int i; for (i = 0; i < length - 1; i++) { if (nums[i] > root) { break; } } // 判断右子树中是否存在小于根节点的元素 int j; for (j = i; j < length - 1; j++) { if (nums[j] < root) { return false; } } // 递归判断左子树和右子树 bool left = true, right = true; if (i > 0) { left = is_bst_postorder(nums, i); } if (i < length - 1) { right = is_bst_postorder(nums + i, length - i - 1); } return left && right; } int main() { int nums[] = {1, 3, 2, 5, 7, 6, 4}; int length = sizeof(nums) / sizeof(int); if (is_bst_postorder(nums, length)) { printf("The integer sequence is a binary search tree's postorder traversal.\n"); } else { printf("The integer sequence is not a binary search tree's postorder traversal.\n"); } return 0; } ``` 输出结果为: ``` The integer sequence is a binary search tree's postorder traversal. ``` 注意,在判断右子树中是否存在小于根节点的元素时,应该从分界点开始遍历,而不是从根节点的位置开始遍历。因为右子树的元素一定在根节点的右边,而不是紧挨着根节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值