1. 程式人生 > 其它 >【LeetCode】663.均勻樹劃分

【LeetCode】663.均勻樹劃分

663.均勻樹劃分

知識點:二叉樹;遞迴

題目描述

給定一棵二叉樹,允許剪斷一個樹枝,這樣能生成兩棵樹,問是否存在一條樹枝,使得其被剪斷後產生的兩棵樹的節點和相等。

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

   10
  /  \
 2    3

和: 15
 

樣例 2:
輸入:     
    1
   / \
  2  10
    /  \
   2   20
輸出: False
解釋: 無法通過移除一條樹邊將這棵樹劃分成結點之和相等的兩棵子樹。
 

解法一:二叉樹遍歷

拆分兩棵樹,然後讓兩棵樹的節點值之和相等,所以可以直接求整棵樹的節點值,然後看是否有哪顆樹的節點值之和為整個和的一半。
所以可以遍歷二叉樹,用一個數組記錄每個子樹的節點值之和,然後再看數組裡是否有其一半就行了

from collections import deque
class TreeNode:  # 樹節點的結構
    def __init__(self, data):
        self.val = data
        self.leftchild = None
        self.rightchild = None

class Solution:
    def __init__(self):
        self.record_list = []  # 記錄每個子樹的和
    #這個方法的意思是if題目中給的並不是樹的結構,而是一個數組,也就是樹的層序遍歷,那要能夠根據層序遍歷構建樹
    def create_tree(self, nodelist):  # 根據層序遍歷構建樹
        if nodelist[0] == -1:
            return -1
        queue = deque()
        index = 1
        head = TreeNode(nodelist[0])
        queue.append(head)
        while queue:
            cur_node = nodelist[index]
            node = queue.popleft()
            if cur_node == -1:
                node.leftchild = None
            else:
                node.leftchild = TreeNode(cur_node)
                queue.append(node.leftchild)
            index += 1
            if index == len(nodelist): 
                return head
            cur_node = nodelist[index]
            if cur_node == -1:
                node.rightchild = None
            else:
                node.rightchild = TreeNode(cur_node)
                queue.append(node.rightchild)
            index += 1
            if index == len(nodelist):
                return head
        return head

    def sum(self, head_node):
        ans = head_node.val
        if head_node.leftchild != None:
            ans += sum(head_node.left)
        if head_node.rightchild != None:
            ans += sum(head_node.rightchild)
        self.record_list.append(ans)  #記錄每個子樹的和
        return ans
    
    def checkequaltree(self, root):
        allsum = sum(root)
        if allsum % 2 != 0:
            return False
        half_sum = allsum // 2
        self.record_list.pop(len(self.record_list)-1)  #求的是子樹,去除掉root
        return half_sum in self.record_list