给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
思路:本人在二叉搜索树中进行插入的操作,本质上只需要操作叶子结点,别的节点不需要管,因此逻辑不是很复杂
class Solution {
public TreeNode insertIntoBST(TreeNode root, int val) {
//开始递归
if(root == null){
TreeNode node = new TreeNode(val);
return node;
}
if(val < root.val){
root.left = insertIntoBST(root.left,val);
}
if(val > root.val){
root.right = insertIntoBST(root.right,val);
}
return root;
}
}
总结:当要找到要插入的节点位置时候,就可以返回这个新节点给上一层(父亲节点),层层递归最终返回给根节点,返回的根节点就是最终的结果。
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
思路:这一题比上一题就相对来说就复杂一些,因为涉及到需要对二叉树进行更改形状,删除了左右孩子不为空的节点,我们需要移动左子树或者右子树。
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
root = deleteNode1(root,key);
return root;
}
private TreeNode deleteNode1(TreeNode root,int key){
//1.二叉树为空 或者没找到key
if(root == null){
return null;
}
if(root.val == key){
//2.如果要删除的节点为叶子结点
if(root.left == null && root.right == null){
return null;
}
//3.如果要删除节点左不为空右为空
else if(root.left != null && root.right == null ){
return root.left;
}
//4.如果要删除节点右不为空左为空
else if (root.right != null && root.left == null){
return root.right;
}//5.左右都不为空
else {
TreeNode temp = root.right;
while(temp.left != null){
temp = temp.left;
}
temp.left = root.left;
return root.right;
}
}
if(root.val > key) root.left = deleteNode1(root.left,key);
if(root.val < key) root.right = deleteNode1(root.right,key);
return root;
}
}
总结:总体来说可以分为五种情况来看:1.根节点为空或者没有找到对应的节点。2.删除的节点为叶子结点,直接删除就可以了,将null返回给上一层。3.删除节点的时候左孩子没有,右孩子有直接返回右孩子4.删除节点的时候右孩子没有,左孩子有直接返回左孩子。5.最后一种情况也是最复杂的情况就是左右孩子都不为空,因为是平衡二叉树,可以将改结点的左子树的所有结点移动到右子树最左端的节点的左子树的位置就还是回满足平衡二叉树的定义。