博客主页 🏗️
wy的leetcode刷题记录_Day67
wy的leetcode刷题记录_Day67

Author:

wy-1226

©

Wordage:

共计 3455 字

needs:

约 1 分钟

Popular:

208 ℃

Created:

目 录

wy的leetcode刷题记录_Day67

声明

本文章的所有题目信息都来源于leetcode
如有侵权请联系我删掉!
时间:2023-6-1

前言

@TOC

1019. 链表中的下一个更大节点

222. 完全二叉树的节点个数

题目介绍

给你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例 1:
示例 1
输入:root = [1,2,3,4,5,6]
输出:6

示例 2:
输入:root = []
输出:0

示例 3:
输入:root = [1] 输出:1

思路

1.无脑DFS(未利用完全二叉树的性质)
2.二分查找+位运算(为完全利用完全二叉树的性质)
3.利用完全二叉树的性质,完全二叉树的子树中如果不是满二叉树必定只有一个非满二叉树

代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int ans=0;
    int countNodes(TreeNode* root) {
        dfs(root);
        return ans;
    }

    void dfs(TreeNode *node)
    {
        if(node ==nullptr)
            return ;
        ans++;
        dfs(node->left);
        dfs(node->right);
    }
};
class Solution {
public:
    int countNodes(TreeNode* root) {
        if (root == nullptr) {
            return 0;
        }
        int level = 0;
        TreeNode* node = root;
        while (node->left != nullptr) {
            level++;
            node = node->left;
        }
        int low = 1 << level, high = (1 << (level + 1)) - 1;
        while (low < high) {
            int mid = (high - low + 1) / 2 + low;
            if (exists(root, level, mid)) {
                low = mid;
            } else {
                high = mid - 1;
            }
        }
        return low;
    }

    bool exists(TreeNode* root, int level, int k) {
        int bits = 1 << (level - 1);
        TreeNode* node = root;
        while (node != nullptr && bits > 0) {
            if (!(bits & k)) {
                node = node->left;
            } else {
                node = node->right;
            }
            bits >>= 1;
        }
        return node != nullptr;
    }
};
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int ans=0;
    int countNodes(TreeNode* root) {
        if(root==nullptr)
            return 0;
        
        int l_depth=0;
        int r_depth=0;
        TreeNode* node=root;
        while(node->left!= nullptr)
        {
            node=node->left;
            l_depth++;
        }
        node=root;
        while(node->right)
        {
            node=node->right;
            r_depth++;
        }
        if(l_depth==r_depth)
            return pow(2,(l_depth+1))-1;
        else
            return countNodes(root->left)+countNodes(root->right)+1;


    }

};


收获

简单的模拟题

文章二维码
wy的leetcode刷题记录_Day67
共计 0 条评论,点此发表评论
博客主页 wyのblog I know you are here. 百度统计
鄂ICP备2023003777号-1 本站已运行 324 天 13 小时 34 分 自豪地使用 Typecho 建站,并搭配 MyDiary 主题 Copyright © 2023 ~ 2024. wyのblog All rights reserved.
打赏图
打赏博主
欢迎
搜 索
足 迹
分 类
  • 默认分类
  • Code
  • 日记
  • 音乐
  • 游戏
  • 阅读
  • 计划
  • 图片
  • 旅游
  • 影视