LeetCode 663. 均勻樹劃分(樹形DP)

文章目錄

1. 題目

給定一棵有 n 個結點的二叉樹,你的任務是檢查是否可以通過去掉樹上的一條邊將樹分成兩棵,且這兩棵樹結點之和相等。

樣例 1:
輸入:     
    5
   / \
  10 10
    /  \
   2   3
輸出: True
解釋: 
    5
   / 
  10: 15

   10
  /  \
 2    3: 15
 

樣例 2:
輸入:     
    1
   / \
  2  10
    /  \
   2   20
輸出: False
解釋: 無法通過移除一條樹邊將這棵樹劃分成結點之和相等的兩棵子樹。
 
註釋 :
樹上結點的權值範圍 [-100000, 100000]1 <= n <= 10000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/equal-tree-partition
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2. 解題

在這裏插入圖片描述

  • 自底向上求得每個節點的子樹和,更新於節點的 val
  • 遍歷檢查+剪枝,共計2次遍歷
class Solution {
	bool found = false;
	int allsum;
public:
    bool checkEqualTree(TreeNode* root) {
    	allsum = sum(root);
        if(allsum&1) return false;//奇數不可分
    	check(root);
    	return found;
    }
    int sum(TreeNode* root)
    {
    	if(!root) return 0;
    	int l = sum(root->left);
    	int r = sum(root->right);
    	return root->val += l+r;
    }
    bool check(TreeNode* root)
    {
    	if(!root) return false;
        if(found) return true;
    	if(root->left && allsum == 2*root->left->val)
    		return found = true;
    	if(root->right && allsum == 2*root->right->val)
    		return found = true;
    	return check(root->left) || check(root->right);
    }
};

40 ms 31.9 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公衆號(Michael阿明),一起加油、一起學習進步!
Michael阿明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章