关于某种二叉树的生成

利用C++模板生成随机二叉树 构造一个生成随机二叉树的类,二叉树的结点 数、结点所存放的数据类型等都可以是任意的:TreeElement.h描述的是二叉树的结点信息,Tree.h描述二叉树本身,代码如下:TreeElement.h:#ifndef TREEELEMENT_H#define TREEELEMENT_Htemplate class Type>class TreeElement...{private:     阅读详情

引言:

最近在刷题过程中,二叉树的题还是相对来说比较简单的。那是因为二叉树的各类题型都是相关的,都是有迹可循。在二叉树的各种遍历是最简单的,而我在刷题过程中却碰到了一些二叉树的生成,看到题意后感觉无从下手,所以我就写下这篇文章来加深自己对这类题的印象。

题目1:所有可能的满二叉树

题目链接
**题目描述:**满二叉树是一类二叉树,其中每个结点恰好有 0 或 2 个子结点。返回包含 N 个结点的所有可能满二叉树的列表。 答案的每个元素都是一个可能树的根结点。答案中每个树的每个结点都必须有 node.val=0。你可以按任何顺序返回树的最终列表。
输入输出:
在这里插入图片描述

题解:

首先看到二叉树的题,就要有一种意识,那就是考虑递归(除非层次遍历相关的题)。然后再考虑二叉树的性质。满二叉树的节点数必须是奇数,否则无法构成。并且它的左右子树也要是满二叉树。
左子树的节点数可以是1,3,5,…,N-2;右子树的相应的节点数就是N-2,…,5,3,1.所以递归的生成左右子树,然后让根节点连接左子树的各种情况,和右子树相应的各种情况即可。保存每种情况,然后返回即可。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<TreeNode*> help(int N)
    {
        vector<TreeNode*> ve;
        if(N%2==0) return ve;
        if(N==1){
            TreeNode *t=new TreeNode(0);
            ve.push_back(t);
            return ve;
        }
        for(int i=1;i<N;i+=2)//i+=2保证左右子树0的个数为奇数
        {
            vector<TreeNode*> left=help(i);   //建立有i个的左子树,也是满二叉树
            vector<TreeNode*> right=help(N-1-i);  //建立有N-1-i个的右子树,也是满二叉树
            for(TreeNode* l:left)
                for(TreeNode* r:right){
                    TreeNode* t=new TreeNode(0); //以t为根,左子树为left的各种可能,右子树是right的各种可能
                    t->left=l;
                    t->right=r;
                    ve.push_back(t);
                }
        }
        return ve;
    }
    vector<TreeNode*> allPossibleFBT(int N) {
        return help(N);
    }
};

题目2:不同的二叉搜索树

题目链接
题目描述:
给定一个整数 n,生成所有由 1 … n 为节点所组成的二叉搜索树。
输入输出:
在这里插入图片描述

题解:

这一题和上一题相似,差不多就可以说一模一样了,可以使用相同的模板。这不过二叉树的性质不同了.但是只要找出二叉树性质的特点就不难写出此题。上一题的性质上面已经说清楚了,而这一题二叉树的性质就是①根节点的值大于左子树各结点的值,小于右子树各节点的值,②还有就是左右子树也必须是二叉搜索树。而此题的各节点的值是1,2,3,…,n.只要保证先确定一点为根节点的值,然后小于该点的各数建立左子树,大于该点的各数建立右子树,天然的保证了此题二叉搜索树的性质。所以只需遍历1到n,让该处的值作为根节点的值,左子树取遍各种左子树集合中的各值,右子树取遍各种右子树集合中的各值,然后一组合即可。最后把组合的情况保存起来并返回即可。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    vector<TreeNode*> help(int L,int R)
    {
        vector<TreeNode*> ve;
        if(L>R){
            ve.push_back(NULL);
            return ve;
        }
        for(int i=L;i<=R;i++)
        {
            vector<TreeNode*> left_nodes=help(L,i-1); //从L到i-1生成一个二叉搜索树 
            vector<TreeNode*> right_nodes=help(i+1,R); //从i+1到R生成一个二叉搜索树 
            for(TreeNode* left_node :left_nodes)
                for(TreeNode* right_node:right_nodes)
                {
                    TreeNode *t=new TreeNode(i);//然后让i为根左子树是L到i-1的二叉搜索树右子树是 i+1到R的二叉搜索树
                    t->left=left_node;
                    t->right=right_node;
                    ve.push_back(t);
                }
        }
        return ve;
    }
    vector<TreeNode*> generateTrees(int n) {
        if(n==0)  return vector<TreeNode*> {};
        return help(1,n);
    }
};

结尾:

二叉树的题相对来说是比较容易的,只要每一类题(创建、遍历等)都有深刻的理解,那么做二叉树的题应该就没什么问题了。

二叉树的题库 1.在图B-1所示的平衡二叉树中,插入关键字48后得到一棵新平衡二叉树。在新平衡二叉树中,关键字37所在结点的左、右子结点中保存的关键字分别是()。//24,53 解释:插入48以后,该二叉树根结点的平衡因子由-1变为-2,在最小不平衡子树根结点的右子树(R)的左子树(L)中插入新结点引起的不平衡属于RL型平衡旋转,需要做两次旋转操作(先右旋后左旋)。 调整后,关键字37所在结点的左、右子结点... 阅读详情

相关推荐

Java生成满二叉树

java 实现生成一颗满二叉树, 并打印生成的满二叉树

wellsoonqmail的专栏 1729

6.7由遍历序列确定的二叉树

6.7由遍历序列确定的二叉树 在二叉树的遍历中,我们知道,给定一棵二叉树和一种遍历方法,就可以确定该二叉树相应的线性序列。那么,根据给定的遍历序列能否唯一的确定一棵二叉树呢? 显然,只由一种序列是无法确定二叉树的,要根据遍历序列确定二叉树,至少需要知道该二叉树的两种遍历序列。 表 6-1 列出了两种遍历序列组合确定二叉树的情况。 例已知一棵二叉树的先序序列与中序序列分别为: A B C D E F G H I B C A E D G H F I 试构造该二叉树。 分析:根据定义,二叉树的先序遍历是先访问根

WithoutEndFree的博客 499

二叉树生成、遍历与树形输出的全面解读

二叉树是一种常见的树形结构数据,在计算机科学和数据结构中占有重要地位。每个节点最多有两个子节点,分别是左子节点和右子节点。二叉树的特点之一是它的节点层次分明,根节点位于最顶层,其余节点按照从上到下、从左到右的顺序排列。在构建和处理二叉树时,C语言中的结构体(struct)提供了强大的数据组织能力。通过对节点的定义,可以进一步实现整个树的创建、遍历、查找、插入、删除等操作。本章将深入探讨如何在C语言中定义一个二叉树的节点,并分析其结构体的使用方式。

weixin_36431145的博客 819

二叉树生成

此次编程目的是将A(B(D(F,G),J(,L(K))),C(E(H,I)))基于这种二叉树表达形式,根据所给生成二叉树 首先是每个节点的存储类型: typedef struct B_TREE { int data; struct B_TREE *left; struct B_TREE *right; }B_TREE; 每个节点由该点数据和其左右孩子 意识到这种操作实际和表达式获取数据是类似的,在遇字符后改为指定状态进行操作,此时可以用上状态变迁图 此时不进行括号失配等特殊问题的考虑,状态变迁图先

MagicSound的博客 1608

ORACLE 12C RAC 启动报错,错误代码 ORA-27300,ORA-27301,ORA-27302

非一体机,12.2 无任何补丁,2套X86服务器,1节点集群异常(数据库正常,还有会话),2节点正常工作,负载不高,硬件、空间均未检查到异常,多路径存在掉线的情况,但通过Mulitpath -ll 看又是正常的,2根私有网络,其中一根不同,sysctl中配置的稀疏模式。5、再次加成crs alert ohas等集群日志,以及根据现象和错误再次到后台sr中查找可用信息,发现有一个类似问题,12.2 RAC 无任何补丁,报同样错误,解决方案为重启两套服务器。查询MOS文档以及后台文档,排除上面指出的问题。

weixin_42344665的博客 1465

【大模型】大模型知识蒸馏 综述解读(Knowledge Distillation of Large Language Models)

知识蒸馏的(论文)方法总结。归纳了通过数据(如指令、对话、多模态)和训练方法(SFT、RL、数据增强),将复杂技能(如对齐、工具使用、多模态)蒸馏到开源模型的核心框架,附典型模型示例(如Alpaca、LLaVA)。

songxia928_928的博客 4338

LeetCode(力扣)题目中二叉树的如何生成?根据给定顺序列表生成二叉树(python)

在刷 leetcode 二叉树相关的题目时,经常有这样给定的例子,例如: 检查平衡性 实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。 示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true 。 示例 2: 给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \

baoxin1100的博客 4373

摄像头读取出现VIDIOC_STREAMON: No space left on device 错误

先说下原因,linux中为usb camera提供了一个标准的V4L2的驱动以方便使用,只要符合驱动规范就可以实现即插即用usb camera设备,即免驱动安装。 但市面上的USB 摄像头都是2.0的。usb bus的 bandwidth是有限的,而V4L2驱动采用的是贪心原则,即camera会要求获取最大带宽;因此将两个camera接入一路usb bus,打开第二个camera(尤其是采用YUV...

houge101的博客 9290

数据结构--知识点16--搜索算法(二叉树)

文章目录一、树的概念1、特点2、树的术语3、树的种类4、树的存储与表示5、常见的树的应用场景二、二叉树1、概念2、性质 一、树的概念 树是一种抽象数据类型(ADT)或是视作这种抽象数据类型的数据结构 1、特点 每个节点有零个或多个子节点 没有父节点的节点称为根节点 每一个非根节点有且只有一个父节点 除了根节点外,每个子节点可以分为**多个不相交(因为都只有一个父节点)**的子树 2、树的术语 节点的度:一个节点含有的子树的个数称为该节点的度 树的度:一棵树中,最大的节点的度称为树的度 叶节点或终端节点

ANingL的博客 3543

华为OD机试双机位C卷:打印机队列 (C++/Py/C/Java/Js/Go)

华为OD机试双机位C卷 打印机队列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 打印机队列。

qq_45776114的博客 1794

SAP ABAP 缓冲同步揭秘——从 DDLOG 表到 RSDBBUF3 的完整实践指南

DDLOG 看似一张不起眼的系统表,却承担着 SAP 多实例环境下的数据一致性重任。通过掌握其字段意义、解析方法及周边监控工具,你可以在性能与一致性之间找到最佳平衡;通过精细化的参数管理与主动刷新策略,更能在关键业务场景中确保“数据永远是最新的”。愿本文能成为你日常排障与架构决策的参考手册。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 315

二叉树的建立(多种方法)

非递归实现 typedef struct BiTNode{ char data; BiTNode* lchild, *rchild; }BiTree; //非递归实现二叉树的建立 BiTree* BiTreeCreate(){ BiTree* Q[100]; char ch; int front, rear; BiTree* s, *root; root = NULL; fro

normol的博客 7034

YOLOv11改进 | 注意力篇 | YOLOv11引入CA注意力机制

摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~3.2 在Extramodule里创建CA。在CA.py文件里添加给出的CA代码。

tsg6698的博客 2981

生成一个二叉树

想看更多 二叉树的简介 二叉树本身的意义不重要,只学二叉树的话会觉得没什么用,因为他不像栈那样为复杂循环提供了行之有效的解决办法。学习二叉树的目的其实是为了后面的排序树、平衡树、堆等知识做准备。 生成一颗二叉树 生成二叉树的方式大概有两种 第一种是用某种序列+#号(用来代表空指针) 第二种是用中序序列 + 任意一个其他序序列 (前序、后序、层次 ,这种方法不需要用符号去代表空指针)生...

赵阿 2210

里海NX二次开发3000例-专栏目录

UDO(User Defined Object)是“用户自定义对象”。应用非常广,可以用UDO创建自定义特征,也可以对NX原有的特征添加一些特殊信息,这些信息会保存在部件中,以后可以查询。还可以实时追踪NX对象,例如做3D包容盒线框自动追踪实体,做2D矩形框自动追踪图纸尺寸值,这些在下面的例子都有介绍。读者可以自己编译下面的例子,体会理解UDO的用法。------里海 20230512序号内容​链接01使用UDO在所有实体上设置更新回调​链接02使用UDO生成跟踪实体的线框​链接03删除UDO​链接。

王牌飞行员_里海的博客 7720

(王道计算机组成原理笔记)第一章计算机系统概述-第二节:计算机系统层次结构 1(计算机系统组成、计算机硬件)

文章目录一:冯诺依曼体系结构(1)存储程序计算机(2)层次结构二:计算机硬件概述(1)存储器A:存储元、存储单元、存储体、存储字和存储字长B:MAR 一:冯诺依曼体系结构 在冯诺依曼体系结构中,计算机的硬件主要有**存储器,运算器,控制器,输入和输出设备(也叫做I/O设备)**组成。 (1)存储程序计算机 冯诺依曼体系结构也叫做存储程序计算机,计算器和计算机的唯一区别就是计算器是不能编程的,只能做电路板中设定好的固定的运算。 这也就意味着计算器本质就是一个不能编程的计算机,其在硬件层面已经将逻辑写死,如果

快乐江湖的博客 1万+

二叉树生成与打印显示 c语言实现

目录程序效果接口使用举例完整的程序 程序效果 刷题时有个二叉树可视化的程序就好了,于是乎自己写了一个。将"__Tree codes.cpp"及"__Tree codes.h"导入即可使用。 一个 bt_print(root) 函数即可完成二叉树可视化。 先上二叉树打印效果图: 接口 从数组生成二叉树的函数以及打印二叉树的函数为: // 从nums数组生成二叉树。数组元素须为小于等与999的正整数...

weixin_43512663的博客 8137

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

二叉树生成及遍历

文章目录二叉树生成及遍历一、树的简介二、二叉树简介三、生成二叉树四、二叉树的递归五、全部代码 二叉树生成及遍历 前言:由于这样介绍的为二叉树,这里只介绍关于树的基本概念。 一、树的简介 树是一种数据结构,它是由n(n>0)个有限结点组成的一个具有层次关系的集合。树的每个结点有零个或多个子节点,没有父结点的结点称为根节点;每一个非根结点有且仅有一个父节点,除了根节点外,每个子节点可以分为多个不相交的子树。 二、二叉树简介 (摘自百度)二叉树(Binary tree)是树形结构的一个重要类型。许多实际问

weixin_45483328的博客 1493

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

二叉树的生成

二叉树的生成 1、题目要求 From PDD 给定一个 List<Integer[]>,比如 [7, 8]、[2, 3]、[2, 4]、[4, 5]、[4, 6]、[3, 7],其中 integer[0] 表示父节点,integer[1] 表示子节点(排在前面的为左子节点,排在后面的为有子节点) 题目要求:根据这个 List<Integer[]> 生成一棵二叉树,并按照前序遍历输出 根据如上描述,生成的二叉树应该长这样 2 / \ 3 4

Oneby的博客 1524

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

二叉树的生成及其遍历

简单写了一个二叉树的实现-递归 二叉树的节点设计及其接口: public class TreeNode { //键值对 private int key,value; //树的深度 private int N; //左右节点 private TreeNode left,right; public TreeNode(int key,int va...

图图是只猫 1617

(java)随意输入一串数字数组,生成二叉树,生成二叉树后经行遍历输出。再对原有二叉树进行反转,生成镜像二叉树(可运行)

主要用到递归思想,自己调用自己,第一个问题以来于第二问题的解决,第二个依赖于第三个。。。以此类推,当最后一个问题解决时,前面的问题都将解决。 设计二叉树类,其中左右子树属性是其本身类 package beans; import java.util.ArrayList; import java.util.List; public class binaryTree { private ...

XIaoMingCM的博客 1919

生成一棵二叉树

功能:给定一个数组,由此生成一棵二叉树。 分解: 1.考虑将一个节点加入树中,使用递归。 2.考虑如何将整个数组依次加入树中,线性遍历。 public class CreateBinaryTree { /** * 将一个节点加入二叉树 * @param val * @param head * @return */ pub...

Wengzhengcun的博客 2005

Java实现生成二叉树

(1)二叉树是什么: 除叶子节点外,所有节点都拥有左右两条分支。 每个节点都包含着当前节点的值。 最上层的头叫做根节点。 比根节点小的放左边,比根节点大的放右边。 针对大批量的,动态的数据存储,查询增删的效率都非常高,理想状态下时间复杂度O(logN)。 (2)如果有一串数组元素:6,3,2,5,4,1,8,7,9 , 组成的二叉树应该是怎样的? (3)过程解析: 1:首先二叉树包含三个信息,左节点,右节点,还有当前节点value。 2:在创建时肯定是拿一个元素做根节点,然后把后续进来的元素与根节点比较。

whiteBearClimb的博客 1933

给定一个数组生成一颗二叉树

给一个数组生成一颗二叉树

2301_78414685的博客 1545

生成二叉数及二叉树的遍历

生成二叉数及二叉树的遍历 中序生成满二叉数 linkedQueue<binaryTreeNode<char> *> q; void insertByLevel(char a, int j, int l) { if (!q.empty()&&j<l) { binaryTreeNode<char> *t = q.fron...

weixin_43740322的博客 225

生成二叉树

这个方法利用了数组索引和二叉树节点位置的数学关系(左子节点索引为。这种方法不需要队列,代码看起来更简洁,但它只适用于。),通过递归的方式直接创建节点并连接。,那么确实可以有更简单的生成方法。,并且列表中不包含任何。

m0_53271604的博客 273
上一篇: 浅谈STL中的vector
下一篇: 把二叉树转换成树(代码实现)
追梦少年ML
博客等级 码龄7年 36粉丝 89原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值