目录
701.二叉搜索树中的插入操作
题目
代码(迭代法走一边)
代码(递归法走一边)
450.删除二叉搜索树中的节点
题目
代码(递归法走一边)
701.二叉搜索树中的插入操作
题目
给定二叉搜索树(BST)的根节点 root
和要插入树中的值 value
,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。
注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。
示例 1:
输入:root = [4,2,7,1,3], val = 5 输出:[4,2,7,1,3,5]
代码(迭代法走一边)
class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {TreeNode pre = null;TreeNode cur = root;//如果树为空,单独处理(这个不能漏,不然后面pre.val编译会出错)if(root == null){return new TreeNode(val);}//不断进行左右子树判断,使得pre指向插入节点的父节点,cur正好为nullwhile(cur != null){if(cur.val > val){pre = cur;cur = cur.left;}else if(cur.val < val){ //注意这里必须有else,不然会出错因为cur会改变pre = cur;cur = cur.right;}}TreeNode newNode = new TreeNode(val);//如果父节点小,就往左子树插入if(pre.val > val){pre.left = newNode;}//如果父节点大,就往右子树插入else{pre.right = newNode;}return root; //返回根节点}
}
代码(递归法走一边)
class Solution {//遍历的逻辑是自上而下,根据val的大小往一个左or右子树走public TreeNode insertIntoBST(TreeNode root, int val) {//终止条件,说明root已经走到插入元素的节点位置了if(root == null){return new TreeNode(val);}//走一边的单层逻辑if(root.val > val){root.left = insertIntoBST(root.left,val); //插在左子树上,修改左子树}else if(root.val < val){root.right = insertIntoBST(root.right,val); //插在右子树上,修改右子树}return root; //返回中间节点}
}
450.删除二叉搜索树中的节点
题目
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点;
- 如果找到了,删除它。
示例 1:
输入:root = [5,3,6,2,4,null,7], key = 3 输出:[5,4,6,2,null,null,7]
代码(递归法走一边)
class Solution {public TreeNode deleteNode(TreeNode root, int key) {//终止条件if(root == null){return null;}//走一边单层逻辑(自上而下递归)//如果key比root中值小,说明要修改左子树,往左子树走if(root.val > key){root.left = deleteNode(root.left,key); //修改左子树指针 }//如果key比root中值大,说明要修改右子树,往右子树走if(root.val < key){root.right = deleteNode(root.right,key); //修改右子树指针}//如果key等于root中值,说明找到了删除节点if(root.val == key){//情况1:删除节点root是叶子节点if(root.left == null && root.right == null){return null; //返回null,代表直接删除root}//情况2:删除节点root只有左子树else if(root.left != null && root.right == null){return root.left; //返回其左子树,代表删除了root}//情况3:删除节点root只有右子树else if(root.left == null && root.right != null){return root.right; //返回其右子树,代表删除了root}//情况4:删除节点root有左右子树else{TreeNode cur = root.right; //cur是删除节点的右孩子while(cur.left != null){cur = cur.left; //cur一直走到最左下节点}cur.left = root.left; //把删除节点的左子树挂到删除节点右子树的最左下角return root.right; //返回其右子树,代表删除了root,且删除节点的左子树已经挂到右子树了}}return root; //返回根节点}
}