zoukankan      html  css  js  c++  java
  • 【面试题24】二叉搜索树的后序遍历序列

    【题目描述】

    输入一个整数数组,判断该数组是不是某二叉搜索树的后续遍历的结果。假设输入的数组的任意两个数字都互不相等。

    【解决方案】

    后续遍历的最后一个结点为二叉树的根节点,根据BST的特性,数组中前半部分比根节点大的为其左子树的节点,比他小的为其右子树结点,可以递归解决。

    考虑情况:

    1. 完全二叉树;

    2. 只有左子树或右子树的二叉树;

    3. 只有一个结点的二叉树;

    4. 输入的后序遍历的序列没有对应的一棵二叉树;

    5. 输入为null;

    我的代码实现,仅供参考:

     1         public static bool IsBST(int[] arr, int start, int end)
     2         {
     3             if (arr == null || end - start < 0)
     4                 return false;
     5 
     6             int root = arr[end];
     7 
     8             //在二叉搜索树中左子树的节点小于根结点
     9             int i = start;
    10             for (; i < end; i++)
    11             {
    12                 if (arr[i] > root)
    13                     break;
    14             }
    15 
    16             //在二叉搜索树中的右子树的节点大于根结点
    17             int j = i;
    18             for (; j < end; j++)
    19             {
    20                 if (arr[j] < root)
    21                     return false;
    22             }
    23 
    24             //判断左子树是不是二叉树
    25             bool left = true;
    26             if (i - 1 > start)
    27                 left = IsBST(arr, start, i - 1);
    28 
    29             //判断右子树是不是二叉树
    30             bool right = true;
    31             if (i < end - 1)
    32                 right = IsBST(arr, i, end - 1);
    33 
    34             return left && right;
    35         }

    【相关题目】

    输入一个整数数组,判断该数组是不是某二叉搜索树的前序遍历的结果。与上述类似,只不过序列第一个数为根结点。

  • 相关阅读:
    夏令营讲课内容整理 Day 6 Part 3.
    夏令营讲课内容整理 Day 6 Part 2.
    计算几何:模板
    字符串:SAM
    字符串:回文自动机
    字符串:马拉车
    数学&模拟:随机化-矩阵随机化
    模拟:随机增量法
    模拟:爬山算法与模拟退火算法
    模拟:压位高精度
  • 原文地址:https://www.cnblogs.com/HuoAA/p/4806648.html
Copyright © 2011-2022 走看看