刷题笔记(1) 一个序列是否为二叉搜索树的遍历结果

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

二叉搜索树:具体定义:https://blog.csdn.net/zj1131190425/article/details/88654541

是一棵二叉树,可能为空,非空的二叉搜索树满足以下特征:

1.每个元素都有唯一的关键字

2.根节点的左子树中,元素的关键字都小于根节点的关键字

3.根节点的右子树中,元素的关键字都大于根节点的关键字

4.根节点左右子树也都是二叉搜索树

根据二叉搜索树的定义来做:

class Solution {
public:
    bool VerifySquenceOfBST(vector<int> sequence) 
    {
        int size = sequence.size();
        if(size==0)
            return false;
        vector<int> left;    // 左子树
        vector<int> right;    // 右子树
        int root = sequence[size-1];   // 根节点
        int i;    // 寻找左右子树的分界点
        for(i=0; i<size-1; i++)
        {
            if(sequence[i]>root)
            {
                break;   // 找到左右分解
            }
        }

        for(int j=i; j<size-1; j++)
        {
            if(sequence[j]<root)
                return false;
        }

        if(i!=0)  // 有左子树
        {
            for(int j=0; j<i; j++)
            {
                left.push_back(sequence[j]);
            }
        }

        if(i!=size-1-1)  // 有右子树
        {
            for(int j=i; j<size-1; j++)
            {
                right.push_back(sequence[j]);
            }
        }

        if(left.size()>1)
            VerifySquenceOfBST(left);
        if(right.size()>1)
            VerifySquenceOfBST(right);
        return true;
    }
};

这道题目利用递归的方法解题:

链接:https://www.nowcoder.com/questionTerminal/a861533d45854474ac791d90e447bafd
来源:牛客网

1、确定root;

2、遍历序列(除去root结点),找到第一个大于root的位置,则该位置左边为左子树,右边为右子树;

3、遍历右子树,若发现有小于root的值,则直接返回false;

4、分别判断左子树和右子树是否仍是二叉搜索树(即递归步骤1、2、3)。

 

原文链接: https://www.cnblogs.com/ncepubye/p/12724048.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    刷题笔记(1) 一个序列是否为二叉搜索树的遍历结果

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/396654

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年4月6日 上午11:26
下一篇 2023年4月7日 上午9:07

相关推荐