Average of Levels in Binary Tree

来源:互联网 发布:阿基诺三世知乎 编辑:程序博客网 时间:2024/05/22 09:04

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

Input:    3   / \  9  20    /  \   15   7Output: [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.

解析:感觉这个利用nullptr的解答方法还是技巧性很强的,程序员的思路真的很神奇~可能是我还没入门吧。。。贴上c++的解答感受一下:

#include<iostream>#include<vector>#include<queue> using namespace std;template<class T>                  //模版结构体struct TreeNode{    T data;    TreeNode <T> *Lchild, *Rchild; //节点的左子树和右子树    //可选择参数的默认构造函数};template <class T> //模版方法,声明一个模板,虚拟类型名为T(数据类型),尖括号中是模板的参数列表,关键字class后面是类型参数,后面没有分号void createBinaryTree(TreeNode<T> *&root)  //传递指针的引用{    TreeNode<T>* p = root;//指向T类对象的指针    T nodeValue;    cin >> nodeValue;    if (nodeValue == -1)    {        root = NULL;    }    else    {        root = new TreeNode<T>();            //构造一个节点        root->data = nodeValue;        createBinaryTree(root->Lchild);    //递归构造左子树(*p).Lchild,即root所指向的对象中的成员或函数         createBinaryTree(root->Rchild);    //递归构造右子树    }}template<class T>    vector<double> averageOfLevels(TreeNode<T>* root) {        vector<double> ret;        double sum = 0, count = 0;        queue<TreeNode<T>*> q;        q.push(root);        q.push(nullptr);        while (!q.empty()) {            TreeNode<T>* t = q.front();            q.pop();            if (t == nullptr) {                ret.push_back(sum / count);                sum = count = 0.0;                if (!q.empty()) q.push(nullptr);            }            else {                sum += t->data;                ++count;                if (t->Lchild) q.push(t->Lchild);                if (t->Rchild) q.push(t->Rchild);            }        }        return ret;    }int main(){    TreeNode<int> * rootNode = NULL;    cout << "请输入每个结点,回车确认,并以-1结束:\n";    createBinaryTree(rootNode);//3 9 -1 -1 20 15 -1 -1 7 -1 -1    averageOfLevels(rootNode);    return 0;}

其中,对模板参数和声明虚拟类型的使用还是不太熟练,对vector和queue的使用也要加强学习。附上一个c++各容器的比较:
http://www.cnblogs.com/For-her/p/3918761.html