刷题Day9-二叉树(4)
617. 合并二叉树
递归,求和,注意null值情况
700. 二叉搜索树中的搜索
基础二叉搜索树的遍历,没啥好说的
98. 验证二叉搜索树
关键在于判断左子树的最右节点和右子树的最左节点和根节点的关系
530. 二叉搜索树的最小绝对差
跟一个二叉搜索树的根比较,和其最相近的两个节点分别是左子树的最右节点和右子树的最左节点
501. 二叉搜索树中的众数
第一时间想到的方法是使用一个hashmap记录值和出现的次数。
但是考虑到本题是二叉搜索树,应该有更好的解法。
更好的解法:
二叉搜索树的中序遍历的结果是已经排好序的,根据这个结果,可以轻松记录每个数出现的次数
不使用额外的数组空间来运算,使用指针指向上一个节点,因为中序遍历相邻的节点才可能相同,所以这样可以比较节点的值。
236. 二叉树的最近公共祖先
第一想法是遍历,记录每个子节点的父亲节点们,然后依次查找相同的,这个可以过,但是看起来复杂度有点高
更优解法:
使用后续遍历
class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if (root == null || root == p || root == q) { // 递归结束条件 return root; } // 后序遍历 TreeNode left = lowestCommonAncestor(root.left, p, q); TreeNode right = lowestCommonAncestor(root.right, p, q); if(left == null && right == null) { // 若未找到节点 p 或 q return null; }else if(left == null && right != null) { // 若找到一个节点 return right; }else if(left != null && right == null) { // 若找到一个节点 return left; }else { // 若找到两个节点 return root; } } }

浙公网安备 33010602011771号