zoukankan      html  css  js  c++  java
  • IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果

    问题描述:
    输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果。
    如果是返回true,否则返回false。
    例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树的后序遍历结果:
     10
    /    
    6      14
    /      /  
    4   8 12    16
    因此返回true。
    如果输入6, 5, 8, 5, 7 ,则返回false。
     
    分析:

    在后续遍历得到的序列中,最后一个元素为树的根结点。根节点元素将数组分为两部分,左边都小于根节点,右边都大于根节点。递归的确认左右是否是二元查找树即可。

    代码实现:

     1 // 9.cc
     2 #include <iostream>
     3 using namespace std;
     4 
     5 bool verify(int* a, int size) {
     6     if (NULL == a || size <= 0)
     7         return false;
     8 
     9     int root = a[size - 1];
    10 
    11     // 左侧节点比根节点小
    12     int i = 0;
    13     while (i < size - 1 && a[i] <= root)
    14         i++;
    15 
    16     // 右侧节点比根节点大
    17     for(int j = i; j < size - 1; j++) {
    18         if(a[j] < root)
    19             return false;
    20     }
    21 
    22     // 分别验证左右子树
    23     bool left = true;
    24     if(i > 0)
    25         left = verify(a, i);
    26 
    27     bool right = true;
    28     if(i < size - 1)
    29         right = verify(a + i, size - i - 1);
    30 
    31     return (left && right);
    32 }
    33 
    34 int main() {
    35     int a[] = {4, 8, 6, 12, 16, 14, 10};
    36     int size = sizeof(a) / sizeof(int);
    37     bool flag = verify(a, size);
    38     cout << flag << endl;
    39     return 0;
    40 }
  • 相关阅读:
    应该做什么样的研究:以Google为例
    机器学习问题方法总结
    浅析PageRank算法
    轮廓处理函数详细
    近视恢复方法
    一步一步深入视频接口
    什么是cookie
    Linux系统目录数和文件数限制
    九大视频接口全接触
    实时监控网卡流量的命令
  • 原文地址:https://www.cnblogs.com/dracohan/p/3898623.html
Copyright © 2011-2022 走看看