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

今日内容

 

 

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

思路:递归+回溯

 1 /*
 2  * @lc app=leetcode.cn id=235 lang=javascript
 3  *
 4  * [235] 二叉搜索树的最近公共祖先
 5  */
 6 
 7 // @lc code=start
 8 /**
 9  * Definition for a binary tree node.
10  * function TreeNode(val) {
11  *     this.val = val;
12  *     this.left = this.right = null;
13  * }
14  */
15 
16 /**
17  * @param {TreeNode} root
18  * @param {TreeNode} p
19  * @param {TreeNode} q
20  * @return {TreeNode}
21  */
22 var lowestCommonAncestor = function(root, p, q) {
23 
24     if (!root) return root;
25     if (root.val === p.val || root.val === q.val) return root;
26 
27     // 单层逻辑
28     let left = lowestCommonAncestor(root.left, p, q);
29     let right = lowestCommonAncestor(root.right, p, q);
30 
31     if (left !== null && right !== null) return root;
32     else if (left === null && right !== null) return right;
33     else if (left !== null && right === null) return left;
34     else return null;
35 
36 };
 

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

 

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

 思路:递归

我的思路:插入后调整二叉树,其实本题不需要这么复杂(如果不要求平衡二叉树的话,只需要往叶子节点插入就好了)

理论上想到怎么做,但是为什么代码这么简洁?这段代码在哪里进行了插入,又在哪里进行了调整二叉树???

视频讲解

 1 /*
 2  * @lc app=leetcode.cn id=701 lang=javascript
 3  *
 4  * [701] 二叉搜索树中的插入操作
 5  */
 6 
 7 // @lc code=start
 8 /**
 9  * Definition for a binary tree node.
10  * function TreeNode(val, left, right) {
11  *     this.val = (val===undefined ? 0 : val)
12  *     this.left = (left===undefined ? null : left)
13  *     this.right = (right===undefined ? null : right)
14  * }
15  */
16 /**
17  * @param {TreeNode} root
18  * @param {number} val
19  * @return {TreeNode}
20  */
21 var insertIntoBST = function(root, val) {
22     //
23     if (!root) return new TreeNode(val); // 返回插入的节点
24 
25     if (root.val > val) { // 如果插入值小于当前节点的值,递归插入到左子树
26         root.left = insertIntoBST(root.left, val); //插入到左叶子节点下面
27     } else { // 如果插入值大于等于当前节点的值,递归插入到右子树
28         root.right = insertIntoBST(root.right, val);//插入到右叶子节点下面
29  } 30 31 return root; // 返回调整后的树 32 33 };

这道题简单粗暴的方法是:只放在叶子节点上,不考虑再中间插入并重构,如果是平衡二叉树的话就需要了!

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

给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

一般来说,删除节点可分为两个步骤:

  1. 首先找到需要删除的节点;
  2. 如果找到了,删除它。

 考虑到左右子树都不为空的情况下,继续找到右子树的最小节点来替换成为根节点,且要将最小节点从右子树中删除。

 

 1 /*
 2  * @lc app=leetcode.cn id=450 lang=javascript
 3  *
 4  * [450] 删除二叉搜索树中的节点
 5  */
 6 
 7 // @lc code=start
 8 /**
 9  * Definition for a binary tree node.
10  * function TreeNode(val, left, right) {
11  *     this.val = (val===undefined ? 0 : val)
12  *     this.left = (left===undefined ? null : left)
13  *     this.right = (right===undefined ? null : right)
14  * }
15  */
16 /**
17  * @param {TreeNode} root
18  * @param {number} key
19  * @return {TreeNode}
20  */
21 var deleteNode = function(root, key) {
22 
23     findMin = function(root) {
24             while (root.left) {
25                 root = root.left;
26             }
27             return root;
28         }
29         // 终止条件是:找到节点并删除
30     if (!root) return null; // 
31     if (root.val === key) {
32         if (root.left && root.right) { // 如果要删除的节点有左右子树
33             let minNode = findMin(root.right); // 找到右子树中最小的节点
34             root.val = minNode.val; // 用右子树中最小节点的值替换当前节点的值
35             root.right = deleteNode(root.right, minNode.val); // 删除右子树中最小节点
36         } else if (root.left && root.right === null) { // 如果要删除的节点只有左子树,直接返回左子树
37             return root.left;
38         } else if (root.left === null && root.right) { // 如果要删除的节点只有右子树,直接返回右子树
39             return root.right;
40         } else { //左右节点均为空
41             return null;
42         }
43     }
44 
45     if (root.val > key) root.left = deleteNode(root.left, key);
46     else root.right = deleteNode(root.right, key);
47 
48     return root;
49 
50 };

 

 

 

 

 

posted @ 2023-09-15 17:28  子酱  阅读(68)  评论(0)    收藏  举报