Average of Levels in Binary Tree 二叉树的层平均值

给定一个非空二叉树, 返回一个由每层节点平均值组成的数组.

示例 1:

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

注意:

  1. 节点值的范围在32位有符号整数范围内。

思路:

直接采用层序遍历然后相加即得答案,主要是层序遍历怎么遍历,如何设计。

按照之前的思路,设置两个队列,first,second

第一次把根节点压入first,然后first压出,同时把first的所有孩子压入second。

second的节点一次压出,把压出的每个节点的子节点压入first。

这样做思路直接,但是代码有点长。。。

    vector<double> averageOfLevels(TreeNode* root) {
	vector<double> res;
	if (!root) {
		return res;
	}
	queue<TreeNode*> first;
	queue<TreeNode*> second;
	first.push(root);
	double rr = 0.0;
	bool flag = 1;
	int count = 0;
	while (!first.empty() || !second.empty()) {
		if (flag) {
			while (!first.empty() && flag == 1) {
				rr += first.front()->val;
				count++;
				if (first.front()->left) {
					second.push(first.front()->left);
				}
				if (first.front()->right) {
					second.push(first.front()->right);
				}
				first.pop();
			}
			flag = 0;
		}
		else if(flag==0){
			while (!second.empty()) {
				rr += second.front()->val;
				count++;
				if (second.front()->left) {
					first.push(second.front()->left);
				}
				if (second.front()->right) {
					first.push(second.front()->right);
				}
				second.pop();
			}
			flag = 1;
		}
		rr = rr / count;
		res.push_back(rr);
		rr = 0;
		count = 0;
	}
	return res;        
    }

方法二

我们只需要一个queue,每次先计算queue的size,每次内循环只循环size次(相当于只遍历当前层),这样做代码简介:

    vector<double> averageOfLevels(TreeNode* root) {
	vector<double> res;
	if (!root) {
		return res;
	}
	queue<TreeNode*> m;
	m.push(root);
	double cur = 0.0;
	while (!m.empty()) {
		int len = m.size();
		for (int i = 0; i < len; i++) {
			TreeNode* tmp = m.front();
			cur += tmp->val;
			if (tmp->left) {
				m.push(tmp->left);
			}
			if (tmp->right) {
				m.push(tmp->right);
			}
			m.pop();
		}
		res.push_back(cur / len);
		cur = 0;
	}
	return res;        
    }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值