代码随想录算法刷题训练营day22:LeetCode(236)二叉树的最近公共祖先、LeetCode(235) 二叉搜索树的最近公共祖先、LeetCode(701)二叉搜索树中的插入操作、LeetCode(450)删除二叉搜索树中的节点
LeetCode(236)二叉树的最近公共祖先
题目
代码
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//判断终止----------采用后续遍历方法----从下往上遍历//1、根为空if(root==null){return null;}//2、判断左右子树的情况-----递归思想----返回null---即为没有if(root.val==p.val||root.val==q.val){return root;//返回当前的pq值---------上面判断的是返回值}//递归遍历----左右根//左右子树的处理逻辑----查看左右子树是否出现pq值----左右子树为空--的那种情况TreeNode leftTreeNode=lowestCommonAncestor(root.left, p, q);TreeNode rightTreeNode=lowestCommonAncestor(root.right, p, q);//处理根节点-----重点------下面是判断的是有没有if(leftTreeNode!=null&&rightTreeNode!=null){return root;//说明左右子树均找到p或者q的值}else if(leftTreeNode==null&&rightTreeNode!=null){return rightTreeNode;//有确定的了就不会发生变化了}else if(leftTreeNode!=null&&rightTreeNode==null){return leftTreeNode;}else{return null;}}
}
LeetCode(235) 二叉搜索树的最近公共祖先
题目
代码
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val = x; }* }*/class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//判断终止条件//终止条件1、若根节点为空的时候if(root==null){return root;}//终止条件2、若根节点为pq的某个值时----此时在遍历的时候就已经进行测试了if(root.val==p.val||root.val==q.val){return root;}//递归遍历//先左子树遍历---发现左子树是否包含p或者q值TreeNode leftTreeNode=lowestCommonAncestor(root.left, p, q);//同样遍历右子树TreeNode rightTreeNode=lowestCommonAncestor(root.right, p, q);//处理根节点if(leftTreeNode!=null&&rightTreeNode!=null){return root;}else if(leftTreeNode!=null&&rightTreeNode==null){return leftTreeNode;}else if(leftTreeNode==null&&rightTreeNode!=null){return rightTreeNode;}else{return null;//对应前面考虑到的左右子树均为空的情况----静心判断}}}
LeetCode(701)二叉搜索树中的插入操作
题目
代码
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {//在二叉搜索树上插入节点,因为仅在叶子节点上进行插入就能满足所有的插入情况---所以不需要改变树的结构//通过中序遍历+递归算法去做if(root==null){//此时为构造新节点占的位置TreeNode newNode=new TreeNode(val);return newNode;//把新子树创建出来,并返回回去}//进行判断,判断朝左右子树递归的方向if(root.val>val){root.left=insertIntoBST(root.left, val);//将判断后的值连上}if(root.val<val){root.right=insertIntoBST(root.right, val);//将判断后的右边的值返回回去---左右两边仅有一边的值进行返回}//连接完成之后,将根节点的值进行返回return root;//重点----仔细理解}
}
LeetCode(450)删除二叉搜索树中的节点
题目
代码
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public TreeNode deleteNode(TreeNode root, int key) {//考虑删除节点情况-----一共分为五种情况/* * 1、没有找到删除节点* 2、删除节点为叶子节点* 3、删除节点有左子树,没有右子树* 4、删除节点有右子树,没有左子树* 5、删除节点既有左子树又有右子树*///递归算法+先序遍历----先处理根节点在处理左子树和右子树//递归的终止条件if(root==null){return null;//正常的终止条件------同时也是找不到删除节点的情况}//第二个终止条件----即找到要删除的元素if(root.val==key){//判断四种删除节点的情况//1、是叶子节点if(root.left==null&&root.right==null){return null;//返回为空,后面连接对应左子树或者右子树}else if(root.left!=null&&root.right==null){return root.left;//2、删除节点有左子树,没有右子树}else if(root.left==null&&root.right!=null){return root.right;//3、删除节点有右子树。没有左子树}else{//最复杂的一种情况---删除根节点的左右子树均不为空TreeNode currentNode=root.right;//找到右子树最左边的节点while (currentNode.left!=null) {currentNode=currentNode.left;}//将根节点的左子树拿出来currentNode.left=root.left;//此时又变成左空由不空的情况return root.right;}}//终止条件处理完了,现在开始处理单次递归的情况if(root.val>key){//向左边遍历root.left=deleteNode(root.left, key);//此时返回的值直接连接到当前的根节点上}if(root.val<key){//向右边遍历root.right=deleteNode(root.right, key);}return root;//最后将根节点返回//最后将根节点返回}}