- 235. 二叉搜索树的最近公共祖先
-
class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null) return null; //向左遍历 if(root.val > p.val && root.val > q.val){ TreeNode left = lowestCommonAncestor(root.left , p , q); if(left != null) return left; } //向右遍历 if(root.val < p.val && root.val < q.val){ TreeNode right = lowestCommonAncestor(root.right , p , q); if(right != null) return right; } return root; } }
-
该题的关键是利用二叉搜索树的特性,从上往下遍历,要知道第一个在p和q之间的节点就是最近公共祖先,因为不管向右遍历还是向左遍历,都会丢失p或者q。
- 701.二叉搜索树中的插入操作
class Solution { public TreeNode insertIntoBST(TreeNode root, int val) { if (root == null) // 如果当前节点为空,也就意味着val找到了合适的位置,此时创建节点直接返回。 return new TreeNode(val); if (root.val < val){ root.right = insertIntoBST(root.right, val); // 递归创建右子树 }else if (root.val > val){ root.left = insertIntoBST(root.left, val); // 递归创建左子树 } return root; } }
该题的关键是知道把值插在叶子节点的左右,当root==null时,就是插入的时机。
- 450.删除二叉搜索树中的节点
class Solution { public TreeNode deleteNode(TreeNode root, int key) { if (root == null) return root; if (root.val == key) { if (root.left == null) { return root.right; } else if (root.right == null) { return root.left; } else { TreeNode cur = root.right; while (cur.left != null) { cur = cur.left; } cur.left = root.left; root = root.right; return root; } } if (root.val > key) root.left = deleteNode(root.left, key); if (root.val < key) root.right = deleteNode(root.right, key); return root; } }
该题的关键是要考虑五种情况:1、没有找到key 2、key在叶子节点 3、key所在的节点左子树为空,右子树不为空 4、key所在的节点左子树不为空,右子树为空 5、左右子树都不为空