Inorder Successor in BST Leetcode
Given a binary search tree and a node in it, find the in-order successor of that node in the BST.
Note: If the given node has no in-order successor in the tree, return null
.
当知道大小的时候舍弃另一半的tree。
public class Solution { public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { if (root == null) { return null; } List<TreeNode> res = new ArrayList<>(); helper(root, res, p); for (int i = 0; i < res.size(); i++) { if (res.get(i) == p && i != res.size() - 1) { return res.get(i + 1); } } return null; } private void helper(TreeNode root, List<TreeNode> res, TreeNode p) { if (root == null) { return; } if (root.val > p.val) { helper(root.left, res, p); } res.add(root); if (root.val <= p.val) { helper(root.right, res, p); } } }
非递归方法:
1.如果p有右子树,那么从右子树里面找最小值。
2.如果p没有右子树,那么离它最近的比它大的parent就是它的successor。
public class Solution { public TreeNode inorderSuccessor(TreeNode root, TreeNode p) { if (root == null) { return null; } if (p.right != null) { return helper(p.right); } TreeNode parent = null; while (root != null && root != p) { if (root.val > p.val) { parent = root; root = root.left; } else { root = root.right; } } return parent; } public TreeNode helper(TreeNode node) { if (node.left == null) { return node; } return helper(node.left); } }
这道题做了又放下今天又翻出来做。。。看了top solution人家就是很有水平的。。。差距啊。。。
递归方法:
思路也有些类似,但也不知道人家怎么想出来的。。。。
1.如果p有右子树(右子树节点不为null),那么从右子树中寻找最左边的节点。
2.如果p没有右子树了,那么相当于右子树最左边的节点是null,此时返回离它最近的比它大的root节点。
哎这个方法还是以后再回顾一下吧。。。。
public class Solution {
public TreeNode inorderSuccessor(TreeNode root, TreeNode p) {
if (root == null) {
return null;
}
if (root.val <= p.val) {
return inorderSuccessor(root.right, p);
} else {
TreeNode left = inorderSuccessor(root.left, p);
return left != null ? left : root;
}
}
}