zoukankan      html  css  js  c++  java
  • 二叉搜索树的后序遍历序列

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

    我的代码:

    class Solution {
    public:
        bool VerifySquenceOfBST(vector<int> sequence) {
            int nsize = sequence.size();
            if(nsize == 0) return false;
            int root = sequence[nsize - 1];
            int left = 0;
            int leftindex = 0;
            bool flag = true;
            for(int i = 0; i < nsize; i++)
            {
                if(sequence[i] > root)
                {
                    left = sequence[i - 1];
                    leftindex = i - 1;
                    flag = false;
                    break;
                }
            }
            if(flag)
                return true;
            for(int i = leftindex+1;i < nsize;i++)
            {
                if(sequence[i] < root )
                    return false;
            }
            return true;
        }
    };

     正确的代码:

    解析:二叉搜索树,二叉排序树,二叉查找树,都是同一种东西:

    1.它或者是一棵空树,

    2.或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

                   若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

    3.它的左、右子树也分别为二叉排序树。

    由于是后序遍历,vector的最后一位是当前树的跟,我们找到vector中第一个大于root的值就是右子树的第一个节点(这个节点前面的则是左子树的跟),判断从此节点一直到最后都要大于根,(右子树要大于根)。再递归的判断左右子树是否为二叉搜索树。

    还要注意递归的调用条件。

     1 class Solution {
     2 public:
     3     bool VerifySquenceOfBST(vector<int> sequence) {
     4         return BST(sequence,0,sequence.size()-1);
     5     }
     6     bool BST(vector<int> sequence , int begin, int end)
     7     {
     8         if(sequence.empty()||begin>end)
     9             return false;
    10         int root = sequence[end];
    11         int i = begin;
    12         for(;i<end;i++)
    13         {
    14             if(sequence[i] > root)
    15                 break;
    16         }
    17         for(int j = i; j < end; j++)
    18             if(sequence[j] < root)
    19                 return false;
    20         bool left = true;
    21         bool right = true;
    22         if(i>begin)
    23         left = BST(sequence,0,i-1);
    24         if(i<end-1)
    25         right = BST(sequence,i,end-1);
    26         return left&&right;
    27     }
    28 };
  • 相关阅读:
    Java 线程间通信 —— 等待 / 通知机制
    Java 线程基础
    Java 内存模型
    Java 并发机制底层实现 —— volatile 原理、synchronize 锁优化机制、原子操作
    优秀程序员的博客有哪些?
    程序员五一被拉去相亲,结果彻底搞懂了HTTP常用状态码
    【Redis破障之路】三:Redis单线程架构
    【Redis破障之路】一:强大的Redis
    MySQL提升笔记(4)InnoDB存储结构
    MySQL提升笔记(3)日志文件详解
  • 原文地址:https://www.cnblogs.com/Lune-Qiu/p/8693528.html
Copyright © 2011-2022 走看看