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 * @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 };

浙公网安备 33010602011771号