• 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 }
  • 相关阅读:
    第一阶段冲刺(第六天)
    第一阶段冲刺(第五天)
    第一阶段冲刺(第四天)
    第一阶段冲刺(第三天)
    第一阶段冲刺(第二天)
    个人学习进度(第十一周)
    第一阶段冲刺(第一天)
    个人学习进度(第十周)
    个人学习进度(第九周)
    php面向对象说明
  • 原文地址:https://www.cnblogs.com/dracohan/p/3898623.html
Copyright © 2020-2023  润新知