- 描述
Given a binary tree, determine if it is a valid binary search tree (BST).
Assume a BST is defined as follows:
The left subtree of a node contains only nodes with keys less than the node’s key.
The right subtree of a node contains only nodes with keys greater than the node’s key.
Both the left and right subtrees must also be binary search trees.
Example 1:
2
/ \
1 3
Binary tree [2,1,3], return true.
Example 2:
1
/ \
2 3
Binary tree [1,2,3], return false.
- 思路
只有左子树的所有元素都小于根节点并且所有的右子树大于根节点元素,根节点就被验证通过了。为了符合条件,可以找出左子树的最大值与根节点比较,找出右子树的最小值与根节点的元素进行比较,看其是否符合条件。在判断完根节点之后,在调用同样的方法,即递归调用,判断根节点的左元素与右元素是否验证通过,直到所有的节点都判断完毕。下面给出实现的代码 - 代码(c#)
public bool IsValidBST(TreeNode root)
{
if (root == null) return true;//递归结束
bool leftIsVaild = true;
bool rigthIsVaild = true;
if (root.left != null)
{
leftIsVaild = root.val > GetMaxOrMin(root.left, Math.Max);//判断左边最大的元素是否小于根节点
}
if (root.right != null && leftIsVaild)
{
rigthIsVaild = root.val < GetMaxOrMin(root.right, Math.Min);//判断右边最小的元素是否大于根节点
}
if (!(leftIsVaild && rigthIsVaild))
return false;
return IsValidBST(root.left) && IsValidBST(root.right);//继续判断左孩子和右孩子是否符合判断
}
public int GetMaxOrMin(TreeNode treeNode,Func<int,int,int> compare)
{
int v = treeNode.val;
if (treeNode.left != null)
{
v = compare(GetMaxOrMin(treeNode.left, compare), v);//递归调用自己的左孩子获取最大或最小元素
}
if (treeNode.right != null)
{
v = compare(GetMaxOrMin(treeNode.right, compare), v);//递归调用自己的右孩子获取最大或最小元素
}
return v;
}
- 总结
涉及到二叉树的许多算法都可以通过递归的思路去解决。c#中灵活使用委托可以简化代码。 - 相关链接
leetCode原题地址:https://leetcode.com/problems/validate-binary-search-tree/description/