题目
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:
Input: 2 / \ 1 3 Output: true
Example 2:
5 / \ 1 4 / \ 3 6 Output: false Explanation: The input is: [5,1,4,null,null,3,6]. The root node's value is 5 but its right child's value is 4.
分析
1 判断是二叉搜索树, 二叉搜索树是满足左子树结点值始终小于根结点值且根结点值大右结点值
基于这样的理解,可以利用中序遍历的思路来做,只要保存一下当前遍历的结点值和下次遍历到的结点的值进行比较即可
2 顺便把中序遍历的代码写一下,核心是用一个栈来实现, 两个while循环
3 类似的,如果让求二叉搜索树中第k小的值怎么求,仍然中序遍历的思路,在添加到list的地方 处理 --k知道k == 0,返回遍历到的这个结点值即可
代码
isbinarytree
findkthnode
inorder traversal
public boolean isValidBST(TreeNode root) {
if(root == null) return true;
Stack<TreeNode> stack = new Stack<>();
TreeNode pre = null;
while (root != null || stack.size() > 0){
while (root != null){
stack.push(root);
root = root.left;
}
root = stack.pop();
if(pre != null && pre.val >= root.val) return false;
pre = root;
root = root.right;
}
public int kthSmallest(TreeNode root, int k) {
Stack<TreeNode> stack = new Stack<>();
while (root != null || stack.size() > 0){
while (root != null){
stack.push(root);
root = root.left;
}
root = stack.pop();
if(--k == 0) break;
root = root.right;
}
return root.val;
}
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new ArrayList<>();
Stack<TreeNode> stack = new Stack<>();
while (root != null || stack.size() > 0){
while (root != null){
stack.push(root);
root = root.left;
}
root = stack.pop();
list.add(root.val);
root = root.right;
}
return list;
}