代码随想录算法训练营29期|day 22 任务以及具体安排

  •  235. 二叉搜索树的最近公共祖先 
  • 代码随想录算法训练营29期|day 22 任务以及具体安排_第1张图片
  • 
    class Solution {
        public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
            if(root == null) return null;
    
            //向左遍历
            if(root.val > p.val && root.val > q.val){
                TreeNode left = lowestCommonAncestor(root.left , p , q);
                if(left != null) return left;
            }
            //向右遍历
            if(root.val < p.val && root.val < q.val){
                TreeNode right = lowestCommonAncestor(root.right , p , q);
                if(right != null) return right;
            }
    
            return root;
        }
    }

    代码随想录算法训练营29期|day 22 任务以及具体安排_第2张图片

  • 该题的关键是利用二叉搜索树的特性,从上往下遍历,要知道第一个在p和q之间的节点就是最近公共祖先,因为不管向右遍历还是向左遍历,都会丢失p或者q。

  •  701.二叉搜索树中的插入操作 
  • 代码随想录算法训练营29期|day 22 任务以及具体安排_第3张图片
    class Solution {
        public TreeNode insertIntoBST(TreeNode root, int val) {
            if (root == null) // 如果当前节点为空,也就意味着val找到了合适的位置,此时创建节点直接返回。
                return new TreeNode(val);
                
            if (root.val < val){
                root.right = insertIntoBST(root.right, val); // 递归创建右子树
            }else if (root.val > val){
                root.left = insertIntoBST(root.left, val); // 递归创建左子树
            }
            return root;
        }
    }

    该题的关键是知道把值插在叶子节点的左右,当root==null时,就是插入的时机。

  •  450.删除二叉搜索树中的节点 
  • 代码随想录算法训练营29期|day 22 任务以及具体安排_第4张图片
    class Solution {
      public TreeNode deleteNode(TreeNode root, int key) {
        if (root == null) return root;
        if (root.val == key) {
          if (root.left == null) {
            return root.right;
          } else if (root.right == null) {
            return root.left;
          } else {
            TreeNode cur = root.right;
            while (cur.left != null) {
              cur = cur.left;
            }
            cur.left = root.left;
            root = root.right;
            return root;
          }
        }
        if (root.val > key) root.left = deleteNode(root.left, key);
        if (root.val < key) root.right = deleteNode(root.right, key);
        return root;
      }
    }

    该题的关键是要考虑五种情况:1、没有找到key 2、key在叶子节点 3、key所在的节点左子树为空,右子树不为空 4、key所在的节点左子树不为空,右子树为空 5、左右子树都不为空 

你可能感兴趣的:(算法,leetcode,数据结构,java)