我的LeetCode代码仓:https://github.com/617076674/LeetCode
原题链接:https://leetcode-cn.com/problems/find-mode-in-binary-search-tree/
题目描述:
知识点:二叉树的中序遍历
思路一:用哈希表保存每个数字出现的次数
这个思路,遍历二叉树时用前、中、后序3种遍历方式均可。
时间复杂度是O(n),其中n为二叉树中的节点个数。空间复杂度是O(m),其中m为二叉树中不同节点的个数。
JAVA代码:
public class Solution {
private Map<Integer, Integer> map = new HashMap<>();
private int maxCount = 0;
public int[] findMode(TreeNode root) {
preOrderTraversal(root);
Iterator iterator = map.keySet().iterator();
while (iterator.hasNext()) {
Integer integer = (Integer) iterator.next();
if (map.get(integer) != maxCount) {
iterator.remove();
}
}
int[] result = new int[map.size()];
int i = 0;
for (Integer integer : map.keySet()) {
result[i] = integer;
i++;
}
return result;
}
private void preOrderTraversal(TreeNode treeNode) {
if (null == treeNode) {
return;
}
int val = treeNode.val;
if (map.containsKey(val)) {
map.put(val, map.get(val) + 1);
maxCount = Math.max(maxCount, map.get(val));
} else {
map.put(val, 1);
maxCount = Math.max(maxCount, 1);
}
preOrderTraversal(treeNode.left);
preOrderTraversal(treeNode.right);
}
}
LeetCode解题报告:
思路二:二叉树的中序遍历
对于一颗二叉搜索树来说,其中序遍历是递增的,因此很容易能确定某个数出现的次数。
时间复杂度是O(n),其中n为二叉树中的节点个数。空间复杂度是O(m),其中m为二叉树中的众数个数。
JAVA代码:
public class Solution {
private boolean firstNode = true;
private int pre;
private int count = 0;
private int maxCount = 0;
private List<Integer> list = new ArrayList<>();
public int[] findMode(TreeNode root) {
inOrderTraversal(root);
int[] result = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
result[i] = list.get(i);
}
return result;
}
private void inOrderTraversal(TreeNode treeNode) {
if (null == treeNode) {
return;
}
inOrderTraversal(treeNode.left);
if (firstNode) {
firstNode = false;
count = 1;
pre = treeNode.val;
list.add(treeNode.val);
} else {
if (pre == treeNode.val) {
count++;
} else {
count = 1;
pre = treeNode.val;
}
}
if (count > maxCount) {
maxCount = count;
list.clear();
list.add(treeNode.val);
} else if (count == maxCount) {
list.add(treeNode.val);
}
inOrderTraversal(treeNode.right);
}
}
LeetCode解题报告: