235二叉搜索树的最近公共祖先
题目链接235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)
难点在于讨论会有几种情况。
和 236二叉树的公共祖先相似,可以一起看
236二叉树的公共祖先
class Solution {
//回溯 后序遍历
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null)return null;
if(root==p||root==q)return root;
TreeNode left=lowestCommonAncestor(root.left,p,q);
TreeNode right=lowestCommonAncestor(root.right,p,q);
if(left!=null&&right!=null){
return root;
} else if(left!=null&&right==null){
return left;
}else if(left==null&&right!=null){
return right;
}else{
return null;
}
}
}
递归法
二叉搜索树的特性使代码更简单
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null) return null;
if(root==p||root==q)return root;
TreeNode left=lowestCommonAncestor(root.left,p,q);
TreeNode right=lowestCommonAncestor(root.right,p,q);
if(root.val>p.val&&root.val>q.val){
return left;
}else if(root.val<p.val&&root.val<q.val){
return right;
}else{
return root;
}
}
}
迭代法
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
while(root!=null){
if(root.val<p.val&&root.val<q.val){
root=root.right;
}else if(root.val>q.val&&root.val>p.val){
root=root.left;
}else{
break;
}
}
return root;
}
}
701插入操作
题目链接701. 二叉搜索树中的插入操作 - 力扣(LeetCode)
如何利用递归的返回值构建树的结构
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
TreeNode newnode=new TreeNode(val);
if(root==null) return newnode;
if(val>root.val){
root.right=insertIntoBST(root.right,val);
}
if(val<root.val){
root.left=insertIntoBST(root.left,val);
}
return root;
}
}
450删除节点
题目链接450. 删除二叉搜索树中的节点 - 力扣(LeetCode)
难点在于删除节点的同时保证这是一颗二叉搜索树。分情况讨论:一要删除的节点不存在。二存在。存在具体可分为①叶子节点②左子树为空③右子树为空④左右子树都不为空,采取措施为将要删除节点的左子树放到右子树最小的节点上。
递归法
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.right!=null&&root.left==null){
return root.right;
}else{
TreeNode cur=root.right;
while(cur.left!=null){
cur=cur.left;
}
cur.left=root.left;
return root.right;
}
}
if(root.val<key){
root.right=deleteNode(root.right,key);
}
if(root.val>key){
root.left=deleteNode(root.left,key);
}
return root;
}
}
迭代法
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null) return null;
TreeNode cur=root;
TreeNode pre=null;
while(cur!=null){
if(cur.val<key){
pre=cur;
cur=cur.right;
}else if(cur.val>key){
pre=cur;
cur=cur.left;
}else{
break;
}
}
if(pre==null){
return deleteOneNode(cur);
}else if(pre.left!=null&&pre.left.val==key){
pre.left=deleteOneNode(cur);
}else if(pre.right!=null&&pre.right.val==key){
pre.right=deleteOneNode(cur);
}
return root;
}
public TreeNode deleteOneNode(TreeNode node){
if(node==null)return null;
if(node.right==null){
return node.left;
}
TreeNode cur=node.right;
while(cur.left!=null){
cur=cur.left;
}
cur.left=node.left;
return node.right;
}
}