每周一算法2018.01.26

Average of Levels in Binary Tree

SGiven a non-empty binary tree, return the average value of the nodes on each level in the form of an array.
Example 1:
Input:

Output: [3, 14.5, 11]
Explanation:
The average value of nodes on level 0 is 3, on level 1 is 14.5, and on level 2 is 11. Hence return [3, 14.5, 11].
Note:
The range of node’s value is in the range of 32-bit signed integer.

描述:

给定一个非空的二叉树,返回每个级别的节点的平均值的数组

例1: 输入: 3 / \ 9 20
/ \ 15 7
输出:[ 3,14.5,11 ] 解释: 0级节点的平均值为3,第1级为14.5,第2级为11。因此返回[ 3,14.5,11 ]。
注: 节点值的范围在32位有符号整数的范围内。

分析

层次遍历:

1.对于不为空的结点,先把该结点加入到队列中
2.从队列中拿出结点,如果该结点的左右结点不为空,就分别把左右结点加入到队列中
3.重复以上操作直到队列为空

时间复杂度

时间复杂度 O(n) n为节点个数

Java

class Solution {  
    public List<Double> averageOfLevels(TreeNode root) {
         if (root == null){
            return null;
        }

        LinkedList<TreeNode> list = new LinkedList<TreeNode>();
        LinkedList<Double> numbers = new LinkedList<Double>();
        TreeNode currentNode = new TreeNode(0);

        //第一层
        list.add(root);

        double sumOfLevel = 0;
        while(!list.isEmpty()){
            int len = list.size();
            for(int i = 0;i<len;i++){
                //对当前队列中所有元素操作(出队列并加入他的两个子节点)
                currentNode = list.poll();
                sumOfLevel += currentNode.val;
                if(currentNode.left != null){
                    list.offer(currentNode.left);   
                }
                if(currentNode.right != null){
                    list.offer(currentNode.right);   
                }
            }
          double ave = sumOfLevel / (double)len;
            sumOfLevel = 0;
          numbers.add(ave);

        }

        return numbers;
    }
}

C++

class Solution {  
public:  
    vector<double> averageOfLevels(TreeNode* root) {
         queue<TreeNode*> mqueue;
        vector<double> ret;
        if(!root)
            return {};
        mqueue.push(root);
        while(mqueue.size())
        {
            int n = mqueue.size();
            long sum = 0;
            for(int i = 0; i < n; i++)
            {
                TreeNode* r = mqueue.front();
                sum += r->val;
                if(r->left)
                    mqueue.push(r->left);
                if(r->right)
                    mqueue.push(r->right);
                mqueue.pop();
            }
            ret.push_back((double)sum / n);
        }
        return ret;  
    }
};

Swift

class Solution {  
    func averageOfLevels(_ root: TreeNode?) -> [Double] {

      guard let root = root else { return [] }

        var parentsArray = [TreeNode]()
        var averageArray = [Double]()

        parentsArray.append(root)

        while !parentsArray.isEmpty {

            var childrenArray = [TreeNode]()
            var total = 0.0
            var count = 0.0

            for currentNode in parentsArray {

                total += Double(currentNode.val)
                count += 1

                if currentNode.left != nil {
                    childrenArray.append(currentNode.left!)
                }
                if currentNode.right != nil {
                    childrenArray.append(currentNode.right!)
                }
            }

            averageArray.append(total/count)
            parentsArray = childrenArray

        }
        return averageArray
    }
}

本题来自:leetCode

comments powered by Disqus