📜  检查有效的二叉搜索树 c# (1)

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

检查有效的二叉搜索树

在二叉搜索树中,左子树的所有节点小于当前节点,右子树的所有节点大于当前节点。本文将介绍如何在C#中检查一棵二叉树是否为有效的二叉搜索树。

递归检查

我们可以使用递归来检查一棵二叉树是否为有效的二叉搜索树。对于每个节点,我们需要检查其左子树和右子树是否满足二叉搜索树的性质。

代码片段如下:

public bool IsValidBST(TreeNode root) {
    return IsValidBST(root, null, null);
}

private bool IsValidBST(TreeNode root, TreeNode minNode, TreeNode maxNode) {
    if (root == null) {
        return true;
    }

    if ((minNode != null && root.val <= minNode.val) || (maxNode != null && root.val >= maxNode.val)) {
        return false;
    }

    return IsValidBST(root.left, minNode, root) && IsValidBST(root.right, root, maxNode);
}

IsValidBST方法是公共接口,它使用IsValidBST方法的重载版本开始递归。

IsValidBST方法的重载版本需要一个指向最小节点和最大节点的指针,以检查当前节点是否满足二叉搜索树的性质。

具体来说,如果当前节点的值小于等于最小节点的值或者大于等于最大节点的值,则返回false。

否则,递归地检查左右子树是否也满足二叉搜索树的性质。

中序遍历

我们可以使用中序遍历来检查一棵二叉树是否为有效的二叉搜索树。

我们首先对树进行中序遍历,得到一个递增的数组。接着,我们检查该数组是否递增。

代码片段如下:

public bool IsValidBST(TreeNode root) {
    List<int> nums = new List<int>();
    InOrderTraversal(root, nums);
    for (int i = 1; i < nums.Count; i++) {
        if (nums[i] <= nums[i - 1]) {
            return false;
        }
    }
    return true;
}

private void InOrderTraversal(TreeNode root, List<int> nums) {
    if (root == null) {
        return;
    }
    InOrderTraversal(root.left, nums);
    nums.Add(root.val);
    InOrderTraversal(root.right, nums);
}

IsValidBST方法首先调用InOrderTraversal方法,得到一个递增的数组。

接着,我们检查该数组是否递增,如果不是,则该二叉树不是有效的二叉搜索树。

InOrderTraversal方法模拟了二叉树的中序遍历过程,将节点的值添加到列表中。

总结

本文介绍了如何在C#中检查一棵二叉树是否为有效的二叉搜索树,其中包括递归检查和中序遍历两种方法。这些方法都采用了基础的二叉搜索树性质:左子树的所有节点小于当前节点,右子树的所有节点大于当前节点。