赞
踩
主要内容:今天的主要内容是二叉树的第六部分,主要涉及二叉搜索树的最小绝对差
;二叉搜索树中的众数;二叉树的最近公共祖先。
题目:
给你一个二叉搜索树的根节点 r o o t root root ,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例:
输入:
r
o
o
t
=
[
4
,
2
,
6
,
1
,
3
]
root = [4,2,6,1,3]
root=[4,2,6,1,3]
输出:
1
1
1
思路:
把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值:direct/b54a915741f74f9ab515b28243d24f40.gif)
总体代码如下:
class Solution { int result = Integer.MAX_VALUE; TreeNode pre;// 记录上个节点 public int getMinimumDifference(TreeNode root) { if (root == null) return 0; center_search(root); return result; } private void center_search(TreeNode root) {// 中序遍历 if (root == null) return; // 左 center_search(root.left); // 中 if (pre != null) result = Math.min(result, root.val - pre.val); pre = root; // 右 center_search(root.right); } }
题目:
给你一个含重复值的二叉搜索树 B S T BST BST 的根节点 r o o t root root ,找出并返回 B S T BST BST 中的所有众数(即出现频率最高的元素)。
如果树中有不止一个众数,可以按任意顺序返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
输入:
r
o
o
t
=
[
1
,
n
u
l
l
,
2
,
2
]
]
root = [1,null,2,2]]
root=[1,null,2,2]]
输出:
[
2
]
[2]
[2]
思路:
既然是搜索树,它中序遍历就是有序的。
如图:
总体代码如下: 递归法:
class Solution { // 定义一些辅助数据 ArrayList<Integer> resList; int maxCount; int count; TreeNode pre; public int[] findMode(TreeNode root) { resList = new ArrayList<>(); maxCount = 0; count = 0; check(root); int[] nums = new int[resList.size()]; for (int i = 0; i < resList.size(); i++) { nums[i] = resList.get(i); } return nums; } private void check(TreeNode root) { if (root == null) return; // 左 check(root.left); // 中 if (pre == null || root.val != pre.val) { count = 1; } else { count++; } if (count > maxCount) { resList.clear(); resList.add(root.val); maxCount = count; } else if (count == maxCount) { resList.add(root.val); } pre = root; check(root.right); } }
题目:
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T T T 的两个节点 p 、 q p、q p、q,最近公共祖先表示为一个节点 x x x,满足 x x x 是 p 、 q p、q p、q 的祖先且 x x x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
示例:
输入:
r
o
o
t
=
[
3
,
5
,
1
,
6
,
2
,
0
,
8
,
n
u
l
l
,
n
u
l
l
,
7
,
4
]
,
p
=
5
,
q
=
1
root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
root=[3,5,1,6,2,0,8,null,null,7,4],p=5,q=1
输出:
3
3
3
思路:
后序遍历递归法:
代码如下:
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) return root; if (left != null && right == null) return left; else if (left == null && right != null) return right; else return null; } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。