450.删除二叉搜索树中的节点,这道题比较复杂,会有挺多个分类,不能完全理解,所以此题是二刷时的重点关注对象。
235.二叉搜索树的最近公共祖先
思路
二叉搜索树是自带方向的,为什么这么说呢?
因为根节点值大于所有左子树值,小于所有右子树值。
按照上面说的性质,直接比较p/q两节点值和根节点值,若p/q对应值均小于根节点,说明在左子树这边,那么就返回以根节点的左子树作为当前节点返回;反之是在右子树这边的,之后操作都一样。
注意
二叉搜索树的值的特点,使得它自带方向!!!
实现代码
//要利用二叉搜索树的性质
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
if(root==null){
return null;
}
if(p.val<root.val&&q.val<root.val){
return lowestCommonAncestor(root.left,p,q);
}
if(p.val>root.val&&q.val>root.val){
return lowestCommonAncestor(root.right,p,q);
}
return root;
}
}
701.二叉搜索树中的插入操作
思路
二叉搜索树的根节点值大于所有左子树值,小于所有右子树值;
首先判断结束递归条件,就是当当前节点遍历到为空时,那说明可以插入新节点了,所有返回构造值为要求的节点;
要说明一下,就是遍历是一个个节点去找的,当遍历到空时就往那插入;所以接下来判断是在左还是右子树位置时,是获得节点位置的;比较当前节点值和指定值,若前大于后者,说明在左子树这边;反之在右子树那边;判断在哪边这里获得的都是当前节点的左和右子树递归后获得的节点。
注意
不用想太多,没有说指定往哪个位置插,所以遇到空就直接插入就好!!!
实现代码
//关于插入-遇到空的节点就直接插入
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
//首先确定结束条件
if(root==null){
return new TreeNode(val);
}
if(root.val>val){
root.left=insertIntoBST(root.left,val);
}
if(root.val<val){
root.right=insertIntoBST(root.right,val);
}
return root;
}
}
总结
1.关于删除二叉搜索树中的节点,分几种情况,比较复杂,较难理解,所有决定放到二刷再仔细研究,目前需要继续赶接下来的进度。
2.二叉搜索树的性质特点真的要记住并且能利用。