代码随想录算法训练营第二十二天 |235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

58 阅读1分钟

代码随想录算法训练营第二十二天 |235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

235. 二叉搜索树的最近公共祖先

题目链接:235. 二叉搜索树的最近公共祖先

  • 第一个遍历到的在p和q之间的数一定是他们的最近公共祖先
  • 迭代法注意return语句的位置

701. 二叉搜索树中的插入操作

题目链接: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) return new TreeNode(val);
             TreeNode ans = root;
             while(root != null){
                 if(root.left == null && root.val > val){
                     root.left = new TreeNode(val);
                     break;
                 } else if(root.right == null && root.val < val){
                     root.right = new TreeNode(val);
                     break;
                 }
                 if(root.val < val){
                     root = root.right;
                 } else if (root.val > val){
                     root = root.left;
                 }
             }
             return ans;
         }
     }
     ​
     // c++分解做法
     class Solution {
     public:
         // 分解
         TreeNode* insertIntoBST(TreeNode* root, int val) {
             if(root == nullptr) {
                 return new TreeNode(val);
             }
             if(val < root->val) {
                 root->left = insertIntoBST(root->left, val);
             }
             if(val > root->val) {
                 root->right = insertIntoBST(root->right, val);
             }
             // 后序遍历,左右子树完成插入操作后返回自身
             return root;
         }
     };
    

450. 删除二叉搜索树中的节点

题目链接:450. 删除二叉搜索树中的节点

  • 有受害者节点的情况其实就是将root.left腾出来为null. 然后return root.right.
  • return给上一层
  •  else {
                     TreeNode curr = root.right;
                     while(curr.left!=null){
                         curr = curr.left;
                     }
                     curr.left = root.left;
                     return root.right;
                 }
     ​
    
  • 也可以是先把受害者节点和当前符合删除条件的root交换,然后再递归删除掉受害者节点。(更好)
  • 这两种方法不一样
  • image-20230302101529257.png