文章目录

  • 98. 验证二叉搜索树
  • 530. 二叉搜索树的最小绝对差
  • 501. 二叉搜索树中的众数
  • 236. 二叉树的最近公共祖先
  • 235. 二叉搜索树的最近公共祖先
  • 701. 二叉搜索树中的插入操作
  • 450. 删除二叉搜索树中的节点
  • 108. 将有序数组转换为二叉搜索树
  • 538. 把二叉搜索树转换为累加树

98. 验证二叉搜索树

  • 两种方法,一种是将树中序遍历转换为数组,比较是否递增
var isValidBST = function(root) {let arr = [];const inorder = (node) => {if (!node) return;node.left && inorder(node.left);arr.push(node.val);node.right && inorder(node.right);}inorder(root);for (let i = 1; i < arr.length; i++) {// 注意这里的等号,会有特例[2,2,2]if (arr[i - 1] >= arr[i]) {return false;}}return true;
};
  • 第二种方法迭代,同样是比较升序,利用中序遍历将中间节点和前一个节点值进行比较
var isValidBST = function(root) {let pre = null;const inOrder = (root) => {if (!root) return true;let left = inOrder(root.left);if (pre !== null && pre.val >= root.val) return false;pre = root;let right = inOrder(root.right);return left && right;}return inOrder(root);
};

530. 二叉搜索树的最小绝对差

  • 和上题相似
var getMinimumDifference = function(root) {let arr = [], res = Number.MAX_VALUE;const inOrder = (node) => {if (!node) return;node.left && inOrder(node.left);arr.push(node.val);node.right && inOrder(node.right);}inOrder(root);for (let i = arr.length - 1; i > 0; i--) {let diff = arr[i] - arr[i - 1]res = res > diff ? diff : res;}return res;
};
var getMinimumDifference = function(root) {let pre = TreeNode(), res = Number.MAX_VALUE;const inOrder = (node) => {if (!node) return;node.left && inOrder(node.left);if (pre) {res = Math.min(res, node.val - pre.val);}pre = node;node.right && inOrder(node.right);}inOrder(root);return res;
};

501. 二叉搜索树中的众数

  • 最初是想将树转为数组然后判断众数的,代码非常的臃肿
  • 接下来介绍正确方法
  • 用额外空间map
var findMode = function(root) {let map = new Map();const inOrder = (node) => {if (!node) return;node.left && inOrder(node.left);map.set(node.val, map.has(node.val) ? map.get(node.val) + 1 : 1);node.right && inOrder(node.right);}inOrder(root);let res = [], cnt = map.get(root.val);map.forEach((value, key) => {if (cnt === value) {res.push(key);} else if (cnt < value) {cnt = value;res.length = 0;res.push(key);}})return res;
};
  • 顺便介绍一下js中数组的清空
let a = [1, 2, 3];
a.length = 0;
// 赋予数组的长度length小于本身的长度,数组中后面的元素将被截断;赋予数组的长度length大于本身的长度,将扩展数组长度,多的元素为undefined。效率最高
a.splice(0);
// splice清空,效率居中
a= [];
// 直接置空,效率最低
  • 还有一种不需要map的,利用pre存储前一个节点来操作(暂时使用不是很熟练)
var findMode = function(root) {let res = [], pre = root, cnt = 0, maxCnt = 1;const inOrder = (node) => {if (!node) return;node.left && inOrder(node.left);if (pre.val === node.val) {cnt++;} else {cnt = 1;}pre = node;if (cnt === maxCnt) {res.push(node.val);} else if (cnt > maxCnt) {maxCnt = cnt;res.length = 0;res.push(node.val);}node.right && inOrder(node.right);}inOrder(root);return res;
};

236. 二叉树的最近公共祖先

  • 用后续遍历从底层向上传最近的祖先
  • 若一个子树中没有p或q节点,那么这棵子树的根节点会返回一个null;而如果有,从最近的公共祖先节点开始会将自己的节点通过后序遍历传递上来
var lowestCommonAncestor = function(root, p, q) {if (!root || root === p || root === q) return root;let left = lowestCommonAncestor(root.left, p ,q);let right = lowestCommonAncestor(root.right, p, q);if (left && right) return root;else if (left && !right) return left;else if (!left && right) return right;else return null; //  (left == NULL && right == NULL)
};

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

  • 和前一题写法稍有不同
  • 在递归函数有返回值时,我们需要确定要搜索一条边还是搜索整个树
    搜索一条边的写法:
if (递归函数(root->left)) return ;
if (递归函数(root->right)) return ;

搜索整个树的写法:

left = 递归函数(root->left);
right = 递归函数(root->right);
left与right的逻辑处理;
  • 那么前一题就是搜索整个树,这里就是搜索一条边
var lowestCommonAncestor = function(root, p, q) {if (!root) return root;if (root.val > p.val && root.val > q.val) {return lowestCommonAncestor(root.left, p, q);}if (root.val < p.val && root.val < q.val) {return lowestCommonAncestor(root.right, p, q);}return root;
};
  • 然鹅这题用迭代也十分简洁( ̄▽ ̄)/
var lowestCommonAncestor = function(root, p, q) {// 使用迭代的方法while(root) {if(root.val>p.val&&root.val>q.val) {root = root.left;}else if(root.val<p.val&&root.val<q.val) {root = root.right;}else {return root;}}return null;
};

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

  • 根据搜索树的性质遍历到对应的空节点就行了
  • 创建一个节点时前面要加new(第一次忘记了然后找不出错╥﹏╥)
var insertIntoBST = function(root, val) {const travel = (node) => {if (!node) {return new TreeNode(val);}if (node.val < val) {node.right = travel(node.right);}if (node.val > val) {node.left = travel(node.left);}return node;}return travel(root);
};

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

  • 有以下五种情况:

第一种情况:没找到删除的节点,遍历到空节点直接返回了找到删除的节点
第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点
第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点
第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点
第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点右孩子为新的根节点。

var deleteNode = function(root, key) {if (!root) return null;if (key > root.val) {root.right = deleteNode(root.right, key);return root;} else if (key < root.val) {root.left = deleteNode(root.left, key);return root;} else {// 场景1: 该节点是叶节点if (!root.left && !root.right) {return null}// 场景2: 有一个孩子节点不存在if (root.left && !root.right) {return root.left;} else if (root.right && !root.left) {return root.right;}// 场景3: 左右节点都存在const rightNode = root.right;// 获取最小值节点const minNode = getMinNode(rightNode);// 将待删除节点的值替换为最小值节点值root.val = minNode.val;// 删除最小值节点root.right = deleteNode(root.right, minNode.val);return root;}
};
function getMinNode(root) {while (root.left) {root = root.left;}return root;
}

108. 将有序数组转换为二叉搜索树

  • 整体思路就是二分
var sortedArrayToBST = function(nums) {const travel = (left, right) => {if (left > right) return null;let mid = left + Math.floor((right - left) / 2);let root = new TreeNode(nums[mid]);root.left = travel(left, mid - 1);root.right = travel(mid + 1, right);return root;}return travel(0, nums.length - 1);
};

538. 把二叉搜索树转换为累加树

  • 据题意确定遍历方式:右中左,然后将节点val累加即可
var convertBST = function(root) {let pre = 0const travel = (cur) => {if (!cur) return;travel(cur.right);cur.val += pre;pre = cur.val;travel(cur.left);}travel(root);return root;
};

力扣日记11:二叉树3相关推荐

  1. 力扣题目——637. 二叉树的层平均值

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组. 示例: 输入: ...

  2. 力扣题目——103. 二叉树的锯齿形层序遍历

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个二叉树,返回其节点值的锯齿形层序遍历.(即先从左往右,再从右往左进行 ...

  3. 力扣题目——107. 二叉树的层序遍历 II

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定一个二叉树,返回其节点值自底向上的层序遍历. (即按从叶子节点所在层到根 ...

  4. 力扣 (LeetCode)-对称二叉树,树|刷题打卡

    Github来源:力扣 (LeetCode)|刷题打卡 | 求星星 ✨ | 给个❤️关注,❤️点赞,❤️鼓励一下作者 [已开启]任务一:刷题打卡 * 10 篇 哪吒人生信条:如果你所学的东西 处于喜欢 ...

  5. 【Java语言】力扣系列----111. 二叉树的最小深度

    给定一个二叉树,找出其最小深度. 最小深度是从根节点到最近叶子节点的最短路径上的节点数量. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7],3 ...

  6. 【力扣日记】018 四数之和

    题目描述: 给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等 ...

  7. 力扣(Leetcode)-94. 二叉树的中序遍历

    描述 给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例 1: 输入:root = [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root = [] 输出:[] 示例 ...

  8. 力扣226-翻转二叉树(C++,附思路)

     思路: 二叉树有关的题大多都会用到递归,而且对二叉树的处理无非通过前序中序后序三种方式,就看你需要用哪一种遍历.个人感觉二叉树做题就是递归+操作,选一个合适的递归,然后在恰当的位置插入对节点进行操作 ...

  9. leetcode力扣617. 合并二叉树

    给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠. 你需要将他们合并为一个新的二叉树.合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 ...

最新文章

  1. js中操作数组的一些方法
  2. Android - HttpURLConnection 抛出异常
  3. Spring5源码 - 11 Spring事件监听机制_源码篇
  4. 分享一个自用的,随便找到的组件,留作记录
  5. Django03: django加入APP
  6. throws Exception的意思
  7. springboot项目中使用shiro 自定义过滤器和token的方式___shiro使用token登录流程
  8. 数据结构实验 9.求逆序对数
  9. mysql 清空或删除表数据后,控制表自增列值的方法
  10. 重载、类型转换与运算符
  11. .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量
  12. linux展示隐藏的文件,linux怎样设置显示隐藏文件?
  13. [Mysql] FIRST_VALUE()函数 | LAST_VALUE()函数 | NTH_VALUE()函数
  14. SpringBoot下载文件的正确方式~
  15. 这些行业已经开始用数据挖掘了,我们的前途光明
  16. (三)并发编程:特殊的一个单线程:主线程(Main线程)
  17. Promise请求并发
  18. 凭什么都是Java开发三年,而他能进大厂薪资是“我”2倍?
  19. Unity的Animator的动画层(Layer)
  20. 看了360与金山网盾的争执,我有几点疑惑....

热门文章

  1. VSCODE编辑器js代码报红
  2. 一个穷丑矮挫苦逼的一生
  3. java二位数组biaoda_java基础 day14 数组 二维数组 冒泡排序 例题(正则表达式)
  4. word内容里总是有双横线,如何删除
  5. 使用reactjs开发AWTK应用程序
  6. 关于腾讯云server使用FTP具体配置教程
  7. soft Attention 和Hard Attention
  8. python为什么冷门_python 冷门 知识
  9. Win11 实时防护无法开启问题
  10. python极简讲义_Python极简讲义:一本书入门数据分析与机器学习 张玉宏