题目介绍
力扣508题:leetcode-cn.com/problems/mo…
方法:后序遍历
由于要求出以当前节点为根的所有子树元素和,很容易能想到就要使用后序遍历的方式,于是先简单写出后序遍历框架,如下:
public int postOrder(TreeNode root) {
if(root == null) {
return 0;
}
int left = postOrder(root.left);
int right = postOrder(root.right);
//当前节点的子树和就等于当前节点的值加上左右子树的值
return left + right + root.val;
}
接着我们还要计算子树和出现次数,很容易也能想到使用HashMap来存储,key为子树和,value为子树和出现的次数,在遍历的时候顺带更新HashMap中的值。最后再遍历这个Map,就能够得到出现次数最多的子树和,代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
//存储每个子树和出现的次数,key:子树的和,value:子树和出现的次数
Map<Integer,Integer> data = new HashMap<>();
List<Integer> resultList = new ArrayList<>();
int maxFrequent = 0;
public int[] findFrequentTreeSum(TreeNode root) {
postOrder(root);
Set<Map.Entry<Integer, Integer>> entries = data.entrySet();
for (Map.Entry<Integer, Integer> entry : entries) {
//找到出现次数最多的子树和,存入到resultList集合中
if(entry.getValue() == maxFrequent) {
resultList.add(entry.getKey());
}
}
int[] mode = new int[resultList.size()];
for (int i = 0; i < resultList.size(); ++i) {
mode[i] = resultList.get(i);
}
return mode;
}
//使用后续的方式遍历
public int postOrder(TreeNode root) {
if(root == null) {
return 0;
}
int left = postOrder(root.left);
int right = postOrder(root.right);
update(left + right + root.val);
return left + right + root.val;
}
//更新子树和出现的次数
public void update(int x) {
if(data.get(x) != null) {
data.put(x , data.get(x) + 1);
}else {
data.put(x , 1);
}
//刷新出现次数的最大值
maxFrequent = Math.max(maxFrequent, data.get(x));
}
}