二叉树链式结构补充

news2025/9/15 13:16:17

1.二叉树k层结点个数

2.二叉树查找值为x的结点

3.二叉树基础oj练习

1.二叉树k层结点个数

设置k值,k层到1结点的值是k-1,所以1结点到k层的结点也是k-1的距离(高度),这样就可以每下一层就把k值减少一个单位,直到k值为一时就说明到了k层,利用递归过程,每递归一次k值减少一,到k层就返回一上去。

int TreeLevelKSize(BTNode* root, int k)
{
	if (root == NULL)
	{
		return 0;
	}
	if (k == 1)
	{
		return 1;
	}
	return TreeLevelKSize(root->left, k - 1) + TreeLevelKSize(root->right, k - 1);
}

2.二叉树查找值为x的结点

要查找二叉树的值,需要去遍历二叉树,去对比设置值与二叉树的值是否相等

代码实现:

首先判断是否为NULL,才能继续下面的操作,再去判断值是否相等,不相等则往下继续对比,利用递归的操作去往下遍历对比,需要创建临时变量去接收返回来的值,不创建的话找到了却不收等于白找,再判断接收的值是否为NULL,不为NULL就说明找到对应的结点,return执行,不去右子树去查找,已经得到了,还需要注意一点是,最后要加一个返回NULL,不加的话是有问题的,要所有的控制路径都有返回值。

BTNode* TreeFind(BTNode* root, int x)
{
	if (root == NULL)
	{
		return NULL;
	}
	if (root->data == x)
	{
		return root;
	}
	
	BTNode* a = TreeFind(root->left, x);
	if (a)
	{
		return a;
	}
	BTNode* b = TreeFind(root->right, x);
	if (b)
	{
		return b;
	}
	
	return NULL;
}

3.二叉树基础oj练习

1.题目一:

题解:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p==NULL&&q==NULL)
    return true;
    if(p==NULL||q==NULL)
    return false;
    if(p->val!=q->val)
    return false;
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}

 分析:

首先先判断俩个树是否为空树,如果都是空树的话那也算是相等的树,接着判断俩个树是否存在其中一个为空树的情况,这里使用的是||逻辑与,是因为第一个判断已经排除了俩个都为空的情况,所以此判断是排除其中一个为NULL的情况,未触发前面的判断则说明俩个树都存在不为NULL,就开始判读它们的值是否相等,这里要有!=是因为用==就要return true,但是只判断了这个结点相等是不行的,后面的结点还没有判断,所以不能那么早就返回true,最后的返回是次结点的值相等要去下面的左右子树进行判断是否相等,这里用&&逻辑或是要左右子树都是true才行,一层一层往下走所有相等就会把true往上返回,俩个true则说明左右子树的结点值都相等。

2.题目二:

题解:

int TreeNode(struct TreeNode* root)
{
    if(root==NULL)
    return 0;
    return TreeNode(root->left)+TreeNode(root->right)+1;
}
void PrevOver(struct TreeNode* root,int* a,int* i)
{
    if(root==NULL)
    return;
    a[(*i)++]=root->val;
    PrevOver(root->left,a,i);
    PrevOver(root->right,a,i);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) {
    *returnSize=TreeNode(root);
    int* a=(int*)malloc(sizeof(int*)*(*returnSize));
    int i=0;
    PrevOver(root,a,&i);
    return a;
}

分析:

首先参数给的是根结点的地址和一个int*类型的变量,因为要用malloc去开辟空间使用,虽然题目提到了结点的范围,可以直接申请最大范围的空间,但是也可以通过计算结点的个数去按需申请空间,用returnSize来接收树的结点个数,在创建一个数组去接收以前序组成树的值,还需要创建一个函数去把树的值传个数组,这里需要传&i是因为可以积累i的值,不传地址传值的话会导致数组对应位置的值不正确,因为i的值没有得到积累,递归过程中虽然都是i,但是每个递归都是在新的栈区上开辟空间,是名字相同但是是不同的变量,赋值给数组的还需要判断是否为NULL,NULL是不赋给数组的,数组只接收有效的数字,传完这个结点的值之后,通过递归找到下面的结点去接收下面结点的值,函数结束后把接收完的数组a返回就完成了。 

3.题目三:

题解:

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {
    if(p==NULL&&q==NULL)
    return true;
    if(p==NULL||q==NULL)
    return false;
    if(p->val!=q->val)
    return false;
    return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);
}
bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot){
    if(root==NULL&&subRoot==NULL)
    return true;
    if(root==NULL||subRoot==NULL)
    return false;
    if(root->val==subRoot->val&&isSameTree(root,subRoot))
        return true;
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

分析:这道题跟判断俩个树是否相等有相似之处,变成了子树是否与另一个树相等,先判断俩个树是否为空,再判断根结点的值是否相等,并且下面的左右子树都相等才返回true,所以要用逻辑或在根值相等于判断左右子树相等的中间,判断左右子树的函数是判断俩个树是否相等时用的函数,最后的返回是左右子树去调用isSubtree,因为这个结点的值不相等,可能下面的结点满足情况,用递归去往下判断。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1694906.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL的数据库和表

查看数据库 命令行的方式: cd /mysql/bin mysql.exe -uroot -p IP(不是连接自己) 端口(不是3306) show databases; 直接使用图形化界面点击: 查看库里的表 使用命令行查看: 进入mysql数据库 u…

C++ AVLTree

目录 介绍 节点的定义 AVLTree结构 Insert 插入节点 调节平衡因子 void rotateR(node* parent) void rotateL(node* parent) void rotateRL(node* parent) void rotateLR(node* parent) void InOrder() int height() int size() bool isBalance() 介绍 如果是有序插…

python web自动化(Allure报告)

Allure详细安装请看之前的博客 1.Allure配置与⼊⻔ 运⾏⽤例,⽣成allure报告 pip install allure-pytest -i https://mirrors.aliyun.com/pypi/simple/ 运⾏⽤例,⽣成allure报告 # main.py import os import pytest if __name__ __m…

【排序算法】——归并排序(递归与非递归)含动图

制作不易,三连支持一下吧!!! 文章目录 前言一.归并排序递归方法实现二.归并排序非递归方法实现 前言 这篇博客我们将介绍归并排序的原理和实现过程。 一、归并排序递归方法实现 基本思想: 归并排序(MERGE-…

四元数学习总结(1)

导语:相比矩阵,用四元数处理3D旋转的优势是毋庸置疑的,但由于概念复杂,难于理解,一直令我摸不着头脑。最近学习更是发现在机器人、无人机、SLAM等先进领域,四元数被当成实数、整数这样的基础,所…

jmeter安装SSH插件

安装SSH插件 下载jar包: ApacheJMeter-ssh-1.2.0.jar jsch-0.1.55.jar jar包放在jmeter安装路径 lib下和lib/ext文件夹下: 重启jmeter即可:

BGP选路实验

BGP 选路实验 一、实验拓扑 二、实验要求及分析 实验要求: 1、使用preva1策略,确保R4通过R2到达192.168.10.0/24 2、使用AS_Path策略,确保R4通过R3到达192.168.11.0/24 3、配置MED策略,确保R4通过R3到达192.168.12.0/24 4、…

软考-必须要背的内容

一、设计模式 1、创建型 抽象工厂:提供一个接口,创建一系列的相关相互依赖的对象,无需指定具体的类; eg:系统软件,支持多种数据库 生成器:将一个复杂类的表示与构造相分离,使得相…

PX4使用yolo仿真环境搭建

文章目录 前言一、修改机架sdf文件二、安装yolo三、运行 前言 ubuntu20.04 PX4 1.13.3 已配置好PX4 ROS gazebo环境 一、修改机架sdf文件 将双目相机加到仿真的iris机架上 修改下图文件 添加如下&#xff1a; <include><uri>model://stereo_camera</uri>…

D - AtCoder Wallpaper(abc)

思路&#xff1a;f(c, d) f(a, b) - f(a, d) - f(c, b) 代码&#xff1a; int f(int x, int y){if(y % 2 0){y y / 2;int ans y * (x / 4) * 8;x % 4;if(x 1){ans y * 3;}else if(x 2){ans y * 6;}else if(x 3){ans y * 7;}return ans;}else{y / 2;int ans y * (x…

从零开始搭建Springboot项目脚手架4:保存操作日志

目的&#xff1a;通过AOP切面&#xff0c;统一记录接口的访问日志 1、加maven依赖 2、 增加日志类RequestLog 3、 配置AOP切面&#xff0c;把请求前的request、返回的response一起记录 package com.template.common.config;import cn.hutool.core.util.ArrayUtil; import cn.hu…

Go语言的内存泄漏如何检测和避免?

文章目录 Go语言内存泄漏的检测与避免一、内存泄漏的检测1. 使用性能分析工具2. 使用内存泄漏检测工具3. 代码审查与测试 二、内存泄漏的避免1. 使用defer关键字2. 使用垃圾回收机制3. 避免循环引用4. 使用缓冲池 Go语言内存泄漏的检测与避免 在Go语言开发中&#xff0c;内存泄…

SpringCloud+Python 混合微服务,如何打造AI分布式业务应用的技术底层?

尼恩&#xff1a;LLM大模型学习圣经PDF的起源 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;经常性的指导小伙伴们改造简历。 经过尼恩的改造之后&#xff0c;很多小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试机会&#x…

力扣刷题---961. 在长度 2N 的数组中找出重复 N 次的元素【简单】

题目描述&#x1f357; 给你一个整数数组 nums &#xff0c;该数组具有以下属性&#xff1a; nums.length 2 * n. nums 包含 n 1 个 不同的 元素 nums 中恰有一个元素重复 n 次 找出并返回重复了 n 次的那个元素。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3,3] 输…

智能猫眼锁核心解决方案以及芯片简介SSD222

书接上回&#xff0c;前篇文章我们诠释了IP 网络摄像系统的定义以及组成部分的功能&#xff0c;也大概的讲了一下所针对的市场以及举例介绍了一款相关芯片&#xff0c;详情可点击下面卡片浏览高集成IP摄像SOC处理方案简介https://blog.csdn.net/Chipsupply/article/details/139…

XILINX FPGA DDR 学习笔记(一)

DDR 内存的本质是数据的存储器&#xff0c;首先回到数据的存储上&#xff0c;数据在最底层的表现是地址。为了给每个数据进行存放并且在需要的时候读取这个数据&#xff0c;需要对数据在哪这个抽象的概念进行表述&#xff0c;我们科技树发展过程中把数据在哪用地址表示。一个数…

【C++】<知识点> 标准模板库STL(上)

文章目录 一、STL---string类 1. 常用构造函数 2. 常用操作 3. 字符串流处理 二、STL---容器 1. STL及基本概念 2. 顺序容器简介 3. 关联容器简介 4. 容器适配器简介 5. 常用成员函数 三、STL---迭代器 1. 普通迭代器 2. 双向、随机访问迭代器 3. 不同容器的迭代器…

项目思考-编辑器

1、文本生成编辑器 2、图片合成编辑器&#xff08;未完待续&#xff09; 3、文字和图像版本的技术要点&#xff0c;区别&#xff08;未完待续&#xff09; 4、编辑器的人员配置考虑&#xff0c;技术难点分析&#xff08;未完待续&#xff09; 1、文本生成编辑器

AI爆文写作:如何找对标账号的文章?告诉你一个秘密:找低粉爆款的抄!这样风险最小!

一、注册新号来训练推荐爆款的素材 首先第一点:强烈推荐注册一个专用个人微信号,通过阅读,点赞和在看等动作,训练算法为我们推荐爆款素材。 二、为什么要对标低分爆款? 2.1 什么是低粉爆款? 就是粉丝量很少,但却有很高阅读量,甚至10万+阅读的文章。 对标账号的文章…

从零开始学逆向,js逆向启蒙:有道翻译

语言&#xff1a;js、python 工具&#xff1a;pycharm、chrome浏览器F12调试、chatgpt&#xff08;补充js第三方库&#xff0c;转python&#xff09;、node.js(js运行)&#xff08;必须&#xff09; 目标&#xff1a;学习掌握基本js逆向知识。 对象&#xff1a; 有道翻译 &a…