zoukankan      html  css  js  c++  java
  • 剑指Offer-23.二叉搜索树的后序遍历序列(C++/Java)

    题目:

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

    分析:

    二叉树的后序遍历也就是先访问左子树,再访问右子树,最后访问根节点,所以不难发现,所给的数组最后一个元素一定是二叉搜索树的根节点,而如果数组是二叉搜索树的后续遍历的话,就一定会根据数值划分两部分,左边是根节点的左子树,剩下的部分则是根节点的右子树。左子树的数值均小于根节点,右子树的数值均大于根节点。

    例如{5,7,6,9,11,10,8},8是二叉搜索树的根节点,{5,7,6}是左子树,{9,11,10}是右子树。再递归判断。

    6是根节点,5是左子树,7是右子树,由于只剩一个元素了,判断中止,同理{9,11,10}也是如此。

    但如果不是后序遍历的序列,如{7,4,6,5}

    5是根节点,7,4,6三个元素没有办法划分出左右子树,因为二叉搜索树的特性我们知道,左子树所有元素的值都小于根节点,右子树的值均大于根节点,无论是{7},{4,6}还是{7,4},{6}均不符合二叉搜索树的性质,在编程实现的过程中,我们可以遍历数组,当出现第一个大于根节点的元素时,便认为之前的所有元素时这个根节点的左子树,而排除最后一个元素剩下的所有元素便是右子树,查看右子树中的元素如果有小于根节点的元素,便可以直接判断不是二叉搜索树的后续遍历,如果没有就递归执行下去。

    程序:

    C++

    class Solution {
    public:
        bool VerifySquenceOfBST(vector<int> sequence) {
            if(sequence.size() == 0) return false;
            return helper(sequence, 0, sequence.size());
        }
        bool helper(vector<int> &v, int index, int length){
            if(length <= 1)
                return true;
            int i = 0;
            for(; i < length-1; ++i){
                if(v[index + i] > v[index + length -1])
                    break;
            }
            for(int j = i; j < length-1; ++j){
                if(v[index + j] < v[index + length -1])
                    return false;
            }
            return helper(v, index, i) && helper(v, index+i, length-i-1);
        }
    };

    Java

    public class Solution {
        public boolean VerifySquenceOfBST(int [] sequence) {
            if(sequence.length == 0) return false;
            return helper(sequence, 0, sequence.length);
        }
        public boolean helper(int [] sequence, int index, int length){
            if(length <= 1)
                return true;
            //找到第一个大于根节点的元素偏移量,此元素右侧序列为右子树(包括)
            int i = 0;
            for(; i < length - 1; ++i){
                if(sequence[index + i] > sequence[index + length -1])
                    break;
            }
            //检查右子树元素是否都大于根节点
            for(int j = i; j < length - 1; ++j){
                if(sequence[index + j] < sequence[index + length -1])
                    return false;
            }
            return helper(sequence, index, i) && helper(sequence, index+i, length-i-1);
        }
    }
  • 相关阅读:
    微信公众平台—— 获取微信服务器IP地址
    微信公众平台——获取access_token、expires_in
    PHP版本切换
    开源各种系统
    VUE -- 如何快速的写出一个Vue的icon组件?
    Mac下php 5升级到php 7的步骤详解
    Nginx反向代理导致PHP获取不到正确的HTTP_HOST,SERVER_NAME,客户端IP的解决方法
    nginx服务器URL无法自动添加index.php
    php类库安装xml simplexml
    Mac DBeaver Client home is not specified for connection解决办法
  • 原文地址:https://www.cnblogs.com/silentteller/p/11924310.html
Copyright © 2011-2022 走看看