LeetCode6057. 統計值等於子樹平均值的節點數-----DFS
阿新 • • 發佈:2022-05-08
題目表述
給你一棵二叉樹的根節點 root ,找出並返回滿足要求的節點數,要求節點的值等於其 子樹 中值的 平均值 。
注意:
- n 個元素的平均值可以由 n 個元素 求和 然後再除以 n ,並 向下舍入 到最近的整數。
- root 的 子樹 由 root 和它的所有後代組成。
示例 1:
輸入:root = [4,8,5,0,1,null,6]
輸出:5
解釋:
對值為 4 的節點:子樹的平均值 (4 + 8 + 5 + 0 + 1 + 6) / 6 = 24 / 6 = 4 。
對值為 5 的節點:子樹的平均值 (5 + 6) / 2 = 11 / 2 = 5 。
對值為 0 的節點:子樹的平均值 0 / 1 = 0 。
對值為 1 的節點:子樹的平均值 1 / 1 = 1 。
對值為 6 的節點:子樹的平均值 6 / 1 = 6 。
DFS二叉樹後序遍歷
利用二叉樹遞迴後序遍歷,可以依次算出每個當前root節點的子樹的總和,然後向上返回,計算均值看是否滿足題意。用陣列分別儲存節點數目、節點總和、滿足題意的節點數目。 依次向上返回可得到最終結果。
/** * 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 { public int averageOfSubtree(TreeNode root) { return dfs(root)[2]; } public int[] dfs(TreeNode root){ if(root == null) return new int[]{0,0,0}; int[] left = dfs(root.left); int[] right = dfs(root.right); int tot = left[0] + right[0] + root.val; int num = left[1] + right[1] + 1; int res = left[2] + right[2]; if(root.val == tot / num) return new int[]{tot, num,res+1}; return new int[]{tot, num, res}; } }