二叉搜索树是排好序的,比较简单。如果结点值大于p和q,向左搜索,如果节点值大于p和q的值,向右搜索。
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) return lowestCommonAncestor(root.left,p,q);
if(root.val<p.val&&root.val<q.val) return lowestCommonAncestor(root.right,p,q);
return root;
}
}
二、701.二叉搜索树中的插入操作
给定二叉搜索树(BST)的根节点 root
和要插入树中的值 value
,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
其实可以不考虑题目中提示所说的改变树的结构的插入方式。
只要按照二叉搜索树的规则去遍历,遇到空节点就插入节点就可以了。
递归法
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root==null) return new TreeNode(val);
if(val>root.val) root.right=insertIntoBST(root.right,val);
if(val<root.val) root.left=insertIntoBST(root.left,val);
return root;
}
}
迭代法
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
if(root==null) return new TreeNode(val);
TreeNode newRoot=root;
TreeNode pre=root;
while(root!=null)
{
pre=root;
if(root.val>val) root=root.left;
else if(root.val<val) root=root.right;
}
if(pre.val>val) pre.left=new TreeNode(val);
else pre.right=new TreeNode(val);
return newRoot;
}
}
三、450.删除二叉搜索树中的节点
- 第一种情况:没找到删除的节点,遍历到空节点直接返回了
- 找到删除的节点
- 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
- 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
- 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
- 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。
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;
}
}