首页 > 编程语言 >稀碎从零算法笔记Day37-LeetCode:所有可能的真二叉树

稀碎从零算法笔记Day37-LeetCode:所有可能的真二叉树

时间:2024-04-03 23:32:05浏览次数:41  
标签:right TreeNode Day37 稀碎 二叉树 ans null 节点

今天的每日一题,感觉理解的还不够深,有待加深理解

题型:树、分治、递归

链接:894. 所有可能的真二叉树 - 力扣(LeetCode)

来源:LeetCode

题目描述

给你一个整数 n ,请你找出所有可能含 n 个节点的 真二叉树 ,并以列表形式返回。答案中每棵树的每个节点都必须符合 Node.val == 0 。

答案的每个元素都是一棵真二叉树的根节点。你可以按 任意顺序 返回最终的真二叉树列表

真二叉树 是一类二叉树,树中每个节点恰好有 0 或 2 个子节点。(不一定是完全二叉树)

题目样例

示例 1:

输入:n = 7
输出:[[0,0,0,null,null,0,0,null,null,0,0],[0,0,0,null,null,0,0,0,0],[0,0,0,0,0,0,0],[0,0,0,0,0,null,null,null,null,0,0],[0,0,0,0,0,null,null,0,0]]

示例 2:


输入:n = 3
输出:[[0,0,0]]

提示:

  • 1 <= n <= 20

题目思路

真二叉树的定义能看明白,但如何枚举出来所有的情况不知道该如何实现

看了题解,发现了一种类似二叉树的先序遍历的枚举方法

讲方法之前先说一下真二叉树的特点:真二叉树的节点的度只能是0或2,那么其节点数只能是奇数。然后真二叉树的子树,自然也是真二叉树,那么子树的节点数也是奇数。同时可以知道,真二叉树没将一个叶子节点变成非叶子,那么他就需要长出两个孩子——即多了1个叶子节点。推广可知:真二叉树的叶子数是【n+1/2】——其中n是节点数。

那么我们就知道了真二叉树的节点数。这样我们就能枚举左右子树分别有 i / n - i - 1 个节点的情况。创一个数组leftSon[i] 来表示左子树节点数为 i 的情况,那么对应的rightSon[i] 表示右子树的情况。

C++代码

/**
 * 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:
    //每个节点的出度只能是 0 或者 2 
    // 真二叉树 节点数一定为奇数
    // 返回所有真二叉树的情况
    vector<TreeNode*> allPossibleFBT(int n) {
        vector<TreeNode *> ans;
        if(n % 2 == 0)
            return ans;
        // 只有一个节点 或者左/右子树只有一个节点,此时递归结束
        if(n == 1)
        {
            ans = {new TreeNode(0)};
            return ans;
        }
        // 节点数只能是奇数,左/右子树的节点数也得是奇数个
        for(int i = 1;i < n ; i += 2)
        {
            // 对左/右子树的所有节点个数枚举出来
            vector<TreeNode *>leftSon = allPossibleFBT(i);
            vector<TreeNode *> rightSon = allPossibleFBT(n-1-i);
            for(auto L : leftSon)
            {
                for(auto R : rightSon)
                {
                    ans.emplace_back(new TreeNode(0,L,R));
                    // ans.emplace_back(root);
                }
            }
        }
        return ans;
    }
};

结算页面

标签:right,TreeNode,Day37,稀碎,二叉树,ans,null,节点
From: https://blog.csdn.net/m0_63356844/article/details/137298118

相关文章

  • 稀碎从零算法笔记Day36-LeetCode:H指数
    有点绕的一个题,题目描述的有点奇怪(可以看下英文?)题型:数组、模拟链接:274.H指数-力扣(LeetCode)来源:LeetCode题目描述给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。根据维基百科上 h指数......
  • leetcode每日一题 1379. 找出克隆二叉树中的相同节点
    问题描述给你两棵二叉树,原始树original和克隆树cloned,以及一个位于原始树original中的目标节点target。其中,克隆树cloned是原始树original的一个副本。请找出在树cloned中,与target相同的节点,并返回对该节点的引用(在C/C++等有指针的语言中返回节点指针,其他......
  • 二叉树
    <!DOCTYPEhtml><htmllang="en"><head>  <metacharset="UTF-8">  <metahttp-equiv="X-UA-Compatible"content="IE=edge">  <metaname="viewport"content="width=d......
  • LeetCode-1379. 找出克隆二叉树中的相同节点【树 深度优先搜索 广度优先搜索 二叉树】
    LeetCode-1379.找出克隆二叉树中的相同节点【树深度优先搜索广度优先搜索二叉树】题目描述:解题思路一:递归,由于我们比较的是节点而不是节点值(例如C++比较的是地址),所以下面的代码也适用于树中有值相同节点的情况(本题的进阶问题)。解题思路二:递归这题有几个关键点,一:判......
  • 15天【代码随想录算法训练营34期】第六章 二叉树 part02(● 层序遍历 10 ● 226.翻
    层序遍历10102.二叉树的层序遍历(opensnewwindow)#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution......
  • 深入理解数据结构第二弹——二叉树(2)——堆排序及其时间复杂度
    看这篇前请先把我上一篇了解一下:深入理解数据结构第一弹——二叉树(1)——堆-CSDN博客前言:相信很多学习数据结构的人,都会遇到一种情况,就是明明最一开始学习就学习了时间复杂度,但是在后期自己写的程序或者是做到哪个需要判断时间复杂度的题时,仍然判断不出来时间复杂度是多少,今......
  • 代码随想录算法训练营第14天 | 二叉树 | 二叉树的遍历 | 迭代遍历 |统一风格的迭代(待
    理论基础二叉树的存储方式:可以链式也可以顺序用数组顺序存储二叉树的遍历递归遍历递归算法三要素确定递归函数的参数和返回值确定终止条件确定单层递归的逻辑风格不统一的迭代遍历(前后和中序的不同)前序遍历(根左右)//递归版voidtraversal(TreeNode*......
  • 代码随想录算法训练营DAY14|C++二叉树Part.1|二叉树的递归遍历、二叉树的迭代遍历、二
    文章目录二叉树的递归遍历思路CPP代码二叉树的迭代遍历思路前序遍历后序遍历后序遍历二叉树的统一迭代法二叉树的递归遍历144.二叉树的前序遍历、145.二叉树的后序遍历、94.二叉树的中序遍历文章讲解:二叉树的递归遍历视频讲解:每次写递归都要靠直觉?这次带你学......
  • 数据结构之二叉树和平衡二叉树
    1、二叉树:packagecom.datastructure.tree;//一个常用的第三方库是ApacheCommonsCollections,它提供了一个名为BinaryTree的类,用于表示二叉树。//可以使用org.apache.commons.collections4.BinaryTree类创建二叉树和进行操作。//可以在Maven中添加以下依赖项://<dependenc......
  • 14天【代码随想录算法训练营34期】 第六章 二叉树part01(● 理论基础 ● 递归遍历 ●
    理论基础种类满二叉树:k是深度,node数为2^k-1完全二叉树:二叉树底部是从左向右持续的二叉搜索树:左边节点都小于中间节点,右边节点都大于中间节点平衡二叉树AVL:左边和右边高度相差不超过1存储方式链式存储:leftchildptr,rightchildptr线式存储:字符数组保存,2i+1是左孩......