235. 二叉搜索树的最近公共祖先
题目描述
给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。
在百度百科中,最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
解题思路
-
二叉搜索树的性质
- 左子树的所有节点值小于根节点值;
- 右子树的所有节点值大于根节点值;
- 如果节点 p 和 q 的值分别位于当前节点值的两侧,则当前节点即为最近公共祖先。
-
方法一:迭代法
- 从根节点开始遍历;
- 根据节点 p 和 q 的值判断向左子树还是右子树继续遍历;
- 如果当前节点值在 p 和 q 的值之间(包含等于),当前节点即为最近公共祖先。
-
方法二:递归法
- 从根节点递归判断;
- 如果 p 和 q 的值都小于当前节点值,递归查找左子树;
- 如果 p 和 q 的值都大于当前节点值,递归查找右子树;
- 否则当前节点为最近公共祖先。
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null){
return null;
}
TreeNode node = root;
while(node!=null){
if(node.val > p.val && node.val > q.val){
node = node.left;
} else if (node.val < p.val && node.val < q.val) {
node = node.right;
}else{
return node;
}
}
return null;
}
}
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root.val > p.val && root.val > q.val) {
root = lowestCommonAncestor(root.left, p, q);
}else if (root.val < p.val && root.val < q.val){
root = lowestCommonAncestor(root.right, p, q);
}
return root;
}
}
235. 二叉搜索树的最近公共祖先
题目描述
给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。
在百度百科中,最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
解题思路
-
二叉搜索树的性质
- 左子树的所有节点值小于根节点值;
- 右子树的所有节点值大于根节点值;
- 如果节点 p 和 q 的值分别位于当前节点值的两侧,则当前节点即为最近公共祖先。
-
方法一:迭代法
- 从根节点开始遍历;
- 根据节点 p 和 q 的值判断向左子树还是右子树继续遍历;
- 如果当前节点值在 p 和 q 的值之间(包含等于),当前节点即为最近公共祖先。
-
方法二:递归法
- 从根节点递归判断;
- 如果 p 和 q 的值都小于当前节点值,递归查找左子树;
- 如果 p 和 q 的值都大于当前节点值,递归查找右子树;
- 否则当前节点为最近公共祖先。
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
TreeNode node = new TreeNode(val);
if(root==null){
root = node;
return node;
}
if(root.val>val){
root.left = insertIntoBST(root.left,val);
}else {
root.right = insertIntoBST(root.right,val);
}
return root;
}
}
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
TreeNode node = new TreeNode(val);
if(root==null){
root = node;
return node;
}
TreeNode newroot = root;
TreeNode pre = root;
while(root!=null){
pre = root;
if(root.val>val){
root = root.left;
} else {
root = root.right;
}
}
if(pre.val>val){
pre.left = node;
}else {
pre.right = node;
}
return newroot;
}
}
markdown
复制代码
450. 删除二叉搜索树中的节点
题目描述
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
要求:算法时间复杂度为 O(h)O(h)O(h),其中 hhh 为树的高度。
解题思路
-
查找节点
- 根据二叉搜索树的性质:若
key < root.val,在左子树查找;若key > root.val,在右子树查找。
- 根据二叉搜索树的性质:若
-
删除节点的三种情况
- 叶子节点:直接删除,返回
null。 - 只有一个子节点:用该节点的唯一子节点替代它。
- 有两个子节点:找到右子树的最小节点(后继节点),将该节点的值替代当前节点的值,然后删除后继节点。
- 叶子节点:直接删除,返回
代码
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null){
return null;
}
if(root.val == key){
if(root.left == null && root.right == null){
return null;
} else if (root.left != null && root.right == null) {
return root.left;
}else if(root.left == null && root.right != null){
return root.right;
}else if(root.left != null && root.right != null){
TreeNode node = root.right;
while(node.left != null){
node=node.left;
}
node.left = root.left;
return root.right;
}
}
root.left = deleteNode(root.left,key);
root.right = deleteNode(root.right,key);
return root;
}
}

被折叠的 条评论
为什么被折叠?



