二叉树 (4)
617. 合并二叉树 - 力扣(LeetCode) (leetcode-cn.com)
给你两棵二叉树: root1 和 root2 。
想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。
返回合并后的二叉树。
注意: 合并过程必须从两个树的根节点开始。
1 | /** |
1 | //迭代法,层序遍历 |
700. 二叉搜索树中的搜索 - 力扣(LeetCode) (leetcode-cn.com)
二叉搜索树是一个有序树:
- 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
- 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
- 它的左、右子树也分别为二叉搜索树
1 | //递归法,注意二叉搜索树满足左子树小于根节点小于右子树的特点 |
1 | //迭代法,由于二叉搜索树的特点,不需要借助队列或栈。 |
98. 验证二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
根据二叉搜索树的性质,只要满足中序遍历后数组是有序的,就证明是二叉搜索树。
1 | //递归法,中序遍历 |
1 | //迭代法,中序遍历 |
530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) (leetcode-cn.com)
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
根据二叉搜索树的性质,将二叉树中序遍历生成一个有序数组,然后判断数组相邻元素间的最小差值。
1 | //递归法 |
1 | //迭代法 |
501. 二叉搜索树中的众数 - 力扣(LeetCode) (leetcode-cn.com)
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST
中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST
满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
方法1:针对普通二叉树的解法
1 | /** |
方法二:针对二叉搜索树,中序遍历迭代法
1 | /** |
当遍历一条边时,递归函数有返回值;当遍历整个树时,递归函数没有返回值;
在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)。
236. 二叉树的最近公共祖先 - 力扣(LeetCode) (leetcode-cn.com)
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
1 | /** |
总结:
- 求最小公共祖先,需要从底向上遍历,那么二叉树,只能通过后序遍历(即:回溯)实现从低向上的遍历方式。
- 在回溯的过程中,必然要遍历整棵二叉树,即使已经找到结果了,依然要把其他节点遍历完,因为要使用递归函数的返回值(也就是代码中的left和right)做逻辑判断。
- 要理解如果返回值left为空,right不为空为什么要返回right,为什么可以用返回right传给上一层结果。