二叉树的链式访问 与 二叉树专题

目录

  • 二叉树的前、中、后序遍历
  • 求二叉树第K层节点的个数
  • 二叉树查找值为x的节点
  • leetcode相同的树
  • 对称二叉树
  • 二叉树的前序遍历
  • 另一棵子树
  • 牛客 二叉树的遍历

二叉树的前、中、后序遍历

1.前序遍历:先访问节点,再访问子树,最后访问子树
根 左 右
2.中序遍历:先访问子树,再访问,最后访问子树
左 根 右
3.后序遍历:先访问子树,再访问子树,最后访问
左 右 根

N 表示 NULL
前序访问顺序:1 2 3 N N N 4 5 N N 6 N N
中序访问顺序:N 3 N 2 N 1 N 5 N 4 N 6 N
后序访问顺序:N N 3 N 2 N N 5 N N 6 4 1
在这里插入图片描述

求二叉树第K层节点的个数

子问题是:root不为空,k不等于1
转化为求左子树加右子树第三层的节点个数
每层k都减1,如果该层有root == NULL就返回0
在这里插入图片描述


//求二叉树第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);
}

二叉树查找值为x的节点

找到一个值为x的节点就返回,因为函数只有一个返回值
return 只能返回给上一层
如果找到了不存入一个变量中,找到的值就会重复找(后面会丢失找到的值)

//二叉树查找值为x的节点
BTNode* TreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;
	if (root->val == x)
		return root;
	//只能返回给它的上一层

	//前序遍历
	BTNode* ret1 = TreeFind(root->left, x);
	if (ret1)
		return ret1;

	BTNode* ret2 = TreeFind(root->right, x);
	if (ret2)
		return ret2;

	//都没找到
	return NULL;
}

leetcode相同的树

在这里插入图片描述
思路:
比较两棵树的根,左子树和右子树是否相等
1.两棵树的根都为NULL,返回true
2.其中一棵树的根为NULL,两树的节点不相同返回false
3.两树的根都不为NULL,比较两树的根的值
4.子问题:遍历两树的左子树和右子树(比较左根和右根)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool isSameTree(struct TreeNode* p, struct TreeNode* q) 
{
    if(p == NULL&&q == NULL)
    return true;

    //其中一个节点为空,另一个节点不为空,返回false
    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);
}

对称二叉树

在这里插入图片描述
思路:
这题和上一题很想,可以理解为镜像二叉树(即一棵树的左子树和右子树要一样,一棵树的右子树和左子树要一样)

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
bool _isSymmetric(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 _isSymmetric(p->left,q->right)&&_isSymmetric(p->right,q->left);
}
bool isSymmetric(struct TreeNode* root) 
{
    return _isSymmetric(root->left,root->right);
}

二叉树的前序遍历

在这里插入图片描述
思路:
1.先算出二叉树中有多少个节点,再开辟这么多个节点
这样不会造成空间不足或空间浪费
2.i 是数组的下标,要用指针传递过去,不用指针的话,形参i的改变不会影响实参i,可能会覆盖前面的值
在这里插入图片描述
3.前序遍历,如果有节点就把节点中的值放入数组中,如果没有就返回NULL,遵循根左右依次把值放入数组中

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
//算出树的节点个数
int TreeSize(struct TreeNode* root)
{
    return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;
}
//前序遍历
void preorder(struct TreeNode* root,int* arr,int* pi)
{
    if(root == NULL)
    return;

    arr[(*pi)++] = root->val;
    preorder(root->left,arr,pi);
    preorder(root->right,arr,pi);
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{
    *returnSize = TreeSize(root);
    int* arr = (int*)malloc(sizeof(int)*(*returnSize));

    //前序遍历
    int i = 0;
    //下标是一个小坑,如果不用指针,每次递归调用i的值是形参有时会覆盖前面的值
    preorder(root,arr,&i);

    return arr;
}

另一棵子树

在这里插入图片描述
思路:
1.root在走,直到root == NULL都没找到值和subRoot相同的节点,那么就返回false
2.如果能找到和root相同的节点,那么比较root后面的节点(子树中)是否和subRoot相同
3.只要找到一个子树是和subRoot相同的那么就返回true

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */

//这里面子树与另一题两个子树是否相同有一样的逻辑
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)
{
    //subRoot不为空,使用root在递归,所以root可能会走到空false
    //subRoot至少有一个节点
    if(root == NULL)
    return false;

    if(root->val == subRoot->val&&
    issametree(root,subRoot))
    return true;
    
    //root在走,subRoot不走,之后利用root和subRoot相等的节点,再用issametree比较是否是子树
    return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);
}

牛客 二叉树的遍历

在这里插入图片描述
思路:
总体来说是先开一个100个字符的字符串数组,然后构建节点,最后中序遍历打印数组
1.构建节点时要注意如果root == ‘#’时,不能在判断的时候(*pi)++,如果它不是‘#’的话还++就跳过一个字符了
2.开1个节点的树,就把数组中的值放入树中,然后为左树和右树开辟一个节点,最后返回根节点,把各个节点链接起来return root是为了链接节点

#include <stdio.h>
#include<stdlib.h>

typedef struct TreeNode
{ 
   struct TreeNode* left;
   struct TreeNode* right;
   int val;
}TreeNode;
//构建节点
TreeNode* CreatTree(char* a,int* pi)
{
    if(a[*pi] == '#')
    {
        (*pi)++;
        return NULL;
    }
    
    //非空
    TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode));
    root->val = a[(*pi)++];
    //下面这里没有想出来,递归root的左边创建一个节点,
    //然后递归root的右边创建一个节点,
    //最后返回根,链接起来
    root->left = CreatTree(a,pi);
    root->right = CreatTree(a,pi);

    return root;
}
//中序遍历
void order(TreeNode* root)
{
    if(root == NULL)
    return;

    order(root->left);
    printf("%c ",root->val);
    order(root->right);
}
int main() 
{
    char a[100];
    scanf("%s",a);

    int i = 0;
    TreeNode* ret = CreatTree(a,&i);
    order(ret);

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

# windows 安装 mysql 显示 no packages found 解决方法

windows 安装 mysql 显示 no packages found 解决方法 一、问题描述&#xff1a; 安装 mysql 时&#xff0c;出现 no packages found 不能进行下一步安装了&#xff0c; 如下图&#xff1a; 二、解决方法&#xff1a; 1、路径问题&#xff0c;系统不能识别你的安装包路径&…

MTK6769芯片性能参数_MT6769规格书_datasheet

联发科MT6769处理器采用了台积电12nm工艺。它具有8核CPU&#xff0c;采用2Cortex A75 2.0GHz 6Cortex A55 1.7GHz的构架。该处理器搭载了Mali-G52 MC2 GPU&#xff0c;运行速度高达820MHz&#xff0c;能够提供出色的图形处理性能。此外&#xff0c;MT6769还提供高达8GB的快速L…

无法启动此程序,因为计算机中丢失 api-ms-win-crt-string-11-1-0.dl。尝试重新安装该程序以解决此问题。

在windows server2012系统中利用WinSW部署jar包时&#xff0c;报错&#xff1a;无法启动此程序&#xff0c;因为计算机中丢失 api-ms-win-crt-string-11-1-0.dl。尝试重新安装该程序以解决此问题。 原因&#xff1a; 缺少Microsoft Visual C 2015运行库或者已安装低版本运行库…

DevExpress WPF中文教程:Grid - 如何显示摘要(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

conda中创建环境并安装tensorflow1版本

conda中创建环境并安装tensorflow1版本 一、背景二、命令三、验证一下 一、背景 最近需要使用tensorflow1版本的&#xff0c;发个记录&#xff01; 二、命令 conda create -n tf python3.6 #创建tensorflow虚拟环境 activate tf #激活环境&#xff0c;每次使用的时候都…

机器学习与AI大数据的融合:开启智能新时代

在当今这个信息爆炸的时代&#xff0c;大数据和人工智能&#xff08;AI&#xff09;已经成为推动社会进步的强大引擎。作为AI核心技术之一的机器学习&#xff08;Machine Learning, ML&#xff09;&#xff0c;与大数据的深度融合正引领着一场前所未有的科技革命&#xff0c;不…

太速科技-FMC209-基于FMC的4路125MAD输入、2路1GDA输出子卡

FMC209-基于FMC的4路125MAD输入、2路1GDA输出子卡 一、板卡概述 本子卡基于FMC连接器实现4路125M采样率AD输出&#xff0c;两路1G采样率DA输出子卡&#xff0c;板卡默认由FMC连接器12V供电&#xff0c;支持外参考时钟&#xff0c;外输入时钟&#xff0c;外触发。 …

PE文件学习

一、介绍 PE文件&#xff0c;即Portable Executable文件&#xff0c;是一种标准的文件格式&#xff0c;主要用于微软的Windows操作系统上。这种格式被用来创建可执行程序&#xff08;如.exe文件&#xff09;、动态链接库&#xff08;.DLL文件&#xff09;、设备驱动&#xff0…

汽车信息安全--数据安全:图像脱敏

General 随着车联网的发展&#xff0c;汽车越来越智能化&#xff0c;就像是一部“装着四个轮子的手机”。 有人说&#xff0c;智能手机就如同一部窃听器&#xff0c;无论你开机或者关机&#xff0c;它都会无时不刻地监听着用户的一举一动。 可想而知&#xff0c;智能车辆上…

马工程刑法期末复习笔记重点2

马工程刑法期末复习笔记重点2

8人团队历时半年打造开源版GPT-4o,零延迟演示引爆全网!人人可免费使用!

目录 01 Moshi 02 背后技术揭秘 GPT-4o可能要等到今年秋季才会公开。 然而&#xff0c;由法国8人团队开发的原生多模态Moshi&#xff0c;已经达到了接近GPT-4o的水平&#xff0c;现场演示几乎没有延迟&#xff0c;吸引了大量AI专家的关注。 令人惊讶的是&#xff0c;开源版的…

rtsp地址 + 测试网站 + java(免环境、免插件、零编码转换http播放)

目录 1、创建rtsp网站 2、测试rtsp网站 3、Java实现rtsp播放 ①maven添加依赖 ②访问http地址即可展示视频内容 1、创建rtsp网站 填写邮箱即可获得两个可用的rtsp网站&#xff08;每月可免费用2G&#xff09;&#xff1a; https://rtsp.stream/ 2、测试rtsp网站 测试网络…

Springboot+Vue3开发学习笔记《2》

SpringbootVue3开发学习笔记《2》 博主正在学习SpringbootVue3开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。 总共涉及两部分&#xff0c;第一部分为基础部分学习&#xff0c;第二部分为实战部分。 一、学习路径 1.1 基础部分 配置文件整合MyBatisBea…

在docker配置Nginx环境配置

应用于商业模式集中&#xff0c;对于各种API的调用&#xff0c;对于我们想要的功能进行暴露&#xff0c;对于不用的进行拦截进行鉴权。用于后面的付费 开发环境 正式上线模式 一、常用命令 停止&#xff1a;docker stop Nginx重启&#xff1a;docker restart Nginx删除服务&a…

【笔记】记录一次全新的Java项目部署过程

记录一次全新的Java项目部署过程 环境&#xff1a;CentOS7 一、初始环境准备 yum install wget -y yum install vim -y yum install net-tools -y mkdir /data mkdir /data/html mkdir /data/backend一、安装JDK 17 安装JDK17 # 下载rpm wget https://download.oracle.com…

@amap/amap-jsapi-loader 实现高德地图中添加多边围栏,并可编辑,编辑后获得围栏各个点的经纬度

先上一张效果图 看看是不是大家想要的效果&#xff5e; ❤️ 希望其中的小点能帮助大家&#xff0c;主要看怎么绘制在地图上的代码即可 1.第一步要加入项目package.json中或者直接yarn install它都可以 想必大家应该都会 "amap/amap-jsapi-loader": "0.0.7&qu…

深圳合规新动向,这个关键环节要做好

随着全球商业环境的日益复杂化&#xff0c;企业合规管理已成为维护公司稳健运营和市场竞争力的核心要素。特别是对于位于创新前沿的深圳市&#xff0c;有效的合规管理系统不仅是满足法律和监管要求的必须&#xff0c;更是企业可持续发展的关键。 深圳市在全国率先探索并成功实…

卡尔曼滤波Q和R怎么调

卡尔曼滤波器是一种有效的估计算法&#xff0c;主要用于在存在噪声的环境中估计动态系统的状态。它通过结合预测模型&#xff08;系统动态&#xff09;和观测数据&#xff08;包括噪声&#xff09;来实现这一点。在卡尔曼滤波中&#xff0c;调整过程噪声协方差矩阵 ( Q ) 和测量…

uboot run命令基本使用

run 命令可以用于运行环境变量的中定义的命令,run bootcmd 可以运行bootcmd中启动命令 作用:可以运行我们自定义的环境变量 include/command.h common/cli.c /*** board_run_command() - Fallback function to execute a command** When no command line features are enabled …

自然语言处理学习--3

对自然语言处理领域相关文献进行梳理和总结&#xff0c;对学习的文献进行梳理和学习记录。希望和感兴趣的小伙伴们一起学习。欢迎大家在评论区进行学习交流&#xff01; 论文&#xff1a;《ChineseBERT: Chinese Pretraining Enhanced by Glyph and Pinyin Information》 下面…