您的位置:首页 > 其它

Validate Binary Search Tree

2015-08-12 10:43 267 查看
问题描述

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.

confused what
"{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.

解决思路

1. 递归:当前节点的值 与 左节点的最右子节点(左子树最大的节点)、右节点的最左子节点(右子树最小的节点) 比较;

2. 非递归中序遍历(前后指针);

方法1较方法2有较多的重复计算,方法2的时间复杂度为O(n).

程序

1. 递归

public class Solution {
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}

long leftMax = getLeftMax(root.left);
long rightMin = getRightMin(root.right);
if (leftMax >= root.val || rightMin <= root.val) {
return false;
}

return isValidBST(root.left) && isValidBST(root.right);
}

private long getLeftMax(TreeNode root) {
if (root == null) {
return Long.MIN_VALUE;
}
TreeNode node = root;
while (node.right != null) {
node = node.right;
}
return (long)node.val;
}

private long getRightMin(TreeNode root) {
if (root == null) {
return Long.MAX_VALUE;
}
TreeNode node = root;
while (node.left != null) {
node = node.left;
}
return (long)node.val;
}
}


2. 非递归中序遍历

public class Solution {
// inorder traversal, two pointers
public boolean isValidBST(TreeNode root) {
if (root == null) {
return true;
}
Stack<TreeNode> s = new Stack<>();
TreeNode node = root;
TreeNode pre = null;

while (node != null || !s.isEmpty()) {
while (node != null) {
s.push(node);
node = node.left;
}
if (!s.isEmpty()) {
TreeNode cur = s.pop();
if (pre != null && pre.val >= cur.val) {
return false;
}
pre = cur;
node = cur.right;
}
}

return true;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: