一、LeetCode:637. 二叉树的层平均值
(1)题目描述
给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。
示例 1:
输入:
3
/ \
9 20
/ \
15 7
输出:[3, 14.5, 11]
解释:
第 0 层的平均值是 3 , 第1层是 14.5 , 第2层是 11 。因此返回 [3, 14.5, 11] 。
(2)问题分析
用一个临时变量size纪录每层的结点个数,用一个临时变量sum将每层的结点个数相加,最后用sum/size就是所要求的平均值,加入到数组中。
(3)代码实现
class Solution {
public:
vector<double> averageOfLevels(TreeNode* root) {
auto averages=vector<double>();
auto q=queue<TreeNode*>();
q.push(root);
while(!q.empty()){
double sum=0;
int size=q.size();
for(int i=0;i<size;i++){
auto node =q.front();
q.pop();
sum+=node->val;
auto left=node->left,right=node->right;
if(left!=nullptr){
q.push(left);
}
if(right!=nullptr){
q.push(right);
}
}
averages.push_back(sum/size);
}
return averages;
}
};
二、LeetCode:114. 二叉树展开为链表
(1)问题描述
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入:root = [1,2,5,3,4,null,6]
输出:[1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入:root = []
输出:[]
示例 3:
输入:root = [0]
输出:[0]
(2)问题分析
这道题主要是将二叉树变成右侧的一条链表,将二叉树前序遍历,新建一个结点,这个结点从树的根节点开始,如果碰到左子树结点就指向空,右子树结点就指向下一个。
(3)代码实现
class Solution {
public:
void flatten(TreeNode* root) {
vector<TreeNode*> l;
preorderTraversal(root, l);
int n = l.size();
for (int i = 1; i < n; i++) {
TreeNode *prev = l.at(i - 1), *curr = l.at(i);
prev->left = nullptr;
prev->right = curr;
}
}
void preorderTraversal(TreeNode* root, vector<TreeNode*> &l) {
if (root != NULL) {
l.push_back(root);
preorderTraversal(root->left, l);
preorderTraversal(root->right, l);
}
}
};