📜  门| GATE-CS-2006 |第 53 题(1)

📅  最后修改于: 2023-12-03 15:42:16.184000             🧑  作者: Mango

题目描述

给定一颗二叉树,编写一个函数 isBST() 来判断该二叉树是否为二叉搜索树。

输入格式

输入的参数为一个根节点的指针。每个节点包含三个成员:节点值、左子节点指针和右子节点指针。注意:该指针可能为 null。

输出格式

函数应该返回一个布尔值,如果二叉树是二叉搜索树,则返回 true,否则返回 false 。

示例

例如,对于下面的二叉树,函数 isBST() 应该返回 false。

      5
     / \
    2   7
   / \
  1   6
解题思路

题目要求我们判断给定的二叉树是否为二叉搜索树。而对于二叉搜索树这种数据结构来说,它具有以下特点:

  • 每个节点都包含一个键值。
  • 左子树上所有的键值小于它的根节点键值。
  • 右子树上所有的键值大于它的根节点键值。
  • 左右子树本身也是二叉搜索树。

按照以上定义,我们可以采用中序遍历二叉树的方式来判断它是否为二叉搜索树。因为对于一个二叉搜索树,它的中序遍历结果必然是按照键值从小到大排列的。因此,我们可以按照中序遍历对二叉树进行遍历,判断得到的键值序列是否是递增的。

代码实现
class Node:
    def __init__(self, val=None, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right


def isBST(root):
    # 用于存储中序遍历的结果
    inorder = []

    def traverse(node):
        if not node:
            return

        # 先遍历左子树
        traverse(node.left)

        # 对接到中序遍历序列的尾部
        inorder.append(node.val)

        # 再遍历右子树
        traverse(node.right)

    # 中序遍历树
    traverse(root)

    # 判断中序遍历结果是否递增
    return inorder == sorted(inorder)
总结

本题的思路较为简单,要注意的是需要对边界条件进行处理,如节点为 null 等。同时,对于二叉搜索树的定义,需要熟悉它的特点以便来判断是否为二叉搜索树。