2021-11-2每日刷题打卡

一、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);
        }
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值