leetcode 637. 二叉樹的層平均值

【題目】637. 二叉樹的層平均值

給定一個非空二叉樹, 返回一個由每層節點平均值組成的數組.

示例 1:

輸入:
    3
   / \
  9  20
    /  \
   15   7
輸出: [3, 14.5, 11]
解釋:
第0層的平均值是 3,  第1層是 14.5, 第2層是 11. 因此返回 [3, 14.5, 11].

注意:
節點值的範圍在32位有符號整數範圍內。

【解題思路1】DFS

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Double> averageOfLevels(TreeNode root){
		List<Integer> count = new ArrayList<>();
		List<Double> sum = new ArrayList<>();
		List<Double> res = new ArrayList<>();
		dfs(root,0,sum,count);
		for(int i=0; i<sum.size(); i++){
			res.add(sum.get(i) / count.get(i));
		}
		return res;
	}
	
	public void dfs(TreeNode cur, int layer, List<Double> sum, List<Integer> count){
		if(cur == null){
			return;
		}
		if(layer < sum.size()){
			sum.set(layer, sum.get(layer)+cur.val);
			count.set(layer, count.get(layer)+1);
		}else{
			//當前結點所在的層次(layer)深於sum與count存儲過的最大層次
            //需要爲sum和count都開闢一個新的更深的層次,cur是這個層次中遍歷到的第一個結點
			sum.add(cur.val*1.0);
			count.add(1);
		}
		dfs(cur.left,layer+1,sum,count);
		dfs(cur.right,layer+1,sum,count);
	}
}
class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Integer> count = new ArrayList<>();
        List<Double> res = new ArrayList<>();
        average(root, 0, res, count);
        for(int i=0; i<res.size(); i++){
            res.set(i, res.get(i) / count.get(i));
        }
        return res;
    }
    public void average(TreeNode root, int i, List<Double> sum, List<Integer> count){
        //i表示層數
        if(root == null){
            return;
        }
        if(i < sum.size()){
            sum.set(i, sum.get(i) + root.val);
            count.set(i, count.get(i) +1);
        }else{ //這層還沒有加入和與個數
            sum.add(1.0*root.val);
            count.add(1);
        }
        average(root.left, i+1, sum, count);
        average(root.right, i+1, sum, count);
    }
}

【解題思路2】層次遍歷

public class Solution {
	public List<Double> averageOfLevels(TreeNode root){
		List<Double> res = new ArrayList<>();
		Queue<TreeNode> queue = new LinkedList<>();
		queue.add(root);
		while(!queue.isEmpty()){
			//外層while循環用於遍歷層,判斷的邏輯是:只要queue非空,那就證明至少還有一層沒有遍歷到
			long sum = 0;
			long count = 0;
			Queue<TreeNode> temp = new LinkedList<>();
			while(!queue.isEmpty()){
				//內層while循環用於遍歷本層的每個結點
				TreeNode n = queue.remove();//一個結點出隊列
				sum += n.val;
				count++;
				//將當前結點的左右孩子加入隊列temp
				if(n.left!=null){
					temp.add(n.left);
				}
				if(n.right!=null){
					temp.add(n.right);
				}
			}
			/*
			 * 本層結點遍歷結束,queue中爲空,temp中保存的是下一層的結點;
			 * 將temp傳給queue,外層while循環遍歷下一層結點
			 */
			queue = temp;
			//將本層的平均值加入res數組
			res.add(sum*1.0/count);
		}
		return res;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章