zoukankan      html  css  js  c++  java
  • 二叉搜索树的后序遍历路径(《剑指offer》面试题24)

      题目:输入一个整数数组,判断该数组是不是二叉搜索树的后序遍历序列的结果,如果是,则返回true,如果不是则返回false。假设输入的数组的任意两个数字都互不相同。

      分析:在后序遍历得到的序列中,最后一个数字是根节点的值。数组中前面的数字可以分为两个部分:第一部分是左子树节点的值,它们都比根节点的值小;第二部分是右子树节点的值,它们都比根节点的值大。所以我们首先在数组中从开头处遍历确定右子树第一个节点的位置,这就表明从这个位置一直到最后一个位置(根节点的位置)之前都是右子树。然后我们从刚才找到的右子树的第一个位置,遍历数组中的右子树部分。如果找到一个值小于根节点的值。那就不满足二叉搜索树右子树的值都比根节点的值大这一特性。然后一定要依照这种规则继续检查左右子树,比如{5,3,6,9,11,10,8}。

         这道题目是分治法思想的应用。

    bool VerifySquenceofBST(int a[], int len) {
        if (a == NULL || len <= 0)
            return false;
    
        if (len == 1) return true;
    
        int pos1 = a[len - 1];
        int pos1 = 0;
        while (a[pos1] < root_val)
            pos1++;
    
        int pos2 = pos1;
        for (; pos2 < len - 1; ++pos2) {
            if (a[pos2] < root_val)
                return false;
        }
    
        bool flag_left = true;
        if (pos1 > 0)
            flag_left = VerifySquenceofBST(a, pos1);
    
        bool flag_right = true;
        if (pos1 < len - 1)
            flag_right =VerifySquenceofBST(a + pos1, len - pos1 - 1);
    
        return flag_left && flag_right;
    }
  • 相关阅读:
    P3146 [USACO16OPEN]248
    P2590 [ZJOI2008]树的统计
    P3379 【模板】最近公共祖先(LCA)
    P2253 好一个一中腰鼓!
    数组中出现次数超过一半的数字
    字符串的排列
    二叉搜索树与双向链表
    二叉搜索树的后序遍历序列
    从上往下打印二叉树
    顺时针打印矩阵
  • 原文地址:https://www.cnblogs.com/vincently/p/4776843.html
Copyright © 2011-2022 走看看