输入一个数组,判断该数组是不是二叉搜索树的后序遍历的结果。

解题思路:首先,我们应该对二叉搜索树有所了解。

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

本题是利用递归思想,判断根节点的左子树元素是否小于根节点,右子树元素是否大于根节点。重点在于对左右子树的划分(因为传入的是个数组,因此和数组最后一位作比较)

1.从第0位开始,找到第一位比根节点大的元素,记录此位置i。在此位置之前都属于左子树(此时已经断定左子树都小于根节点) 
2.检查右子树是否都大于跟节点(从第i位开始,到根节点前) 
3.判断左右子树是否都属于二叉搜索树。

代码如下:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) {
      if(sequence.size()==0)
      {
          return 0;
      }
        int len=sequence.size();
        vector<int>leftR;
        vector<int>rightR;
        int i=0;
		//判断左子树
        while(i<len-1)
        {
            if(sequence[i]<sequence[len-1])
            {
                leftR.push_back(sequence[i]);
                i++;
            }
            else{
                break;
            }
        }
		//判断右子树
       while(i<len-1)
        {
            if(sequence[i]>sequence[len-1])
            {
                rightR.push_back(sequence[i]);
                i++;
            }
            else{
                return 0;
            }
        }
		//判断左右子树,进行递归
        bool left=1,right=1;
        if(leftR.size()!=0)
        {
            left=VerifySquenceOfBST(leftR);
        }
       if(rightR.size()!=0)
        {
            right=VerifySquenceOfBST(rightR);
        }
        return left&&right;
    }
};

 

  • 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、付费专栏及课程。

余额充值