1. 程式人生 > 其它 >508 出現次數最多的子樹元素和

508 出現次數最多的子樹元素和

技術標籤:LeetCode

題目描述:
給你一個二叉樹的根結點,請你找出出現次數最多的子樹元素和。一個結點的「子樹元素和」定義為以該結點為根的二叉樹上所有結點的元素之和(包括結點本身)。
你需要返回出現次數最多的子樹元素和。如果有多個元素出現的次數相同,返回所有出現次數最多的子樹元素和(不限順序)。

示例 1:
輸入:
在這裡插入圖片描述
返回 [2, -3, 4],所有的值均只出現一次,以任意順序返回所有值。

示例 2:
輸入:
在這裡插入圖片描述
返回 [2],只有 2 出現兩次,-5 只出現 1 次。

提示: 假設任意子樹元素和均可以用 32 位有符號整數表示。

方法1:
主要思路:解題彙總連結
(1)使用後序遍歷+雜湊統計;

(2)為了計算各個子樹的和,對於樹從下到上進行遍歷,組合出各個子樹的和,避免重複計算;
(3)並在遍歷的過程中,統計出各個和的出現頻次;

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
	//後序遍歷
    int
back_order(TreeNode*root,unordered_map<int,int>&mp){ if(root==NULL){//終止條件 return 0; } //分別求出左右子樹之和 int left_sum=back_order(root->left,mp); int right_sum=back_order(root->right,mp); ++mp[left_sum+right_sum+root->val];//再加上當前結點的值,就是當前子樹的和
return left_sum+right_sum+root->val;//返回當前子樹的和 } vector<int> findFrequentTreeSum(TreeNode* root) { //處理特殊的情形 if(root==NULL){ return{}; } if(root->left==NULL&&root->right==NULL){ return {root->val}; } int max_freq=0;//統計最大頻率 unordered_map<int,int> mp;//統計各個和的頻率 back_order(root,mp);//後續遍歷 for(auto&it:mp){//找出最大頻率 max_freq=max_freq<it.second?it.second:max_freq; } vector<int>res;//儲存結果 for(auto&it:mp){//儲存最大頻率對應的數字 if(it.second==max_freq){ res.push_back(it.first); } } return res; } };