【LeetCode】663.均勻樹劃分
阿新 • • 發佈:2022-04-08
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