【二叉树】oj题

在处理oj题之前我们需要先处理一下之前遗留的问题

在二叉树中寻找为x的节点

BTNode* BinaryTreeFind(BTNode* root, int x)
{if (root == NULL)return NULL;if (root->data == x)return root;BTNode* ret1 = BinaryTreeFind(root->left, x);BTNode* ret2 = BinaryTreeFind(root->right, x);if (ret1)return ret1;if (ret2)return ret2;return NULL;}

递归图
在这里插入图片描述
分别用ret1,ret2指针记录左子树,右子树的返回值,如果在左子树找到就会返回一个地址,用ret1记录指针,使得ret1不为空,此时会递归返回上一层,在上一层中进入if(ret1)条件判断语句中,返回节点为x的地址到上一层,一直到整棵树的根节点.同理ret2不为空也一样.
在这里插入图片描述

#单值二叉树

题目描述
在这里插入图片描述
代码

bool isUnivalTree(struct TreeNode* root) {if(root==NULL)return true;if(root->left&&root->left->val!=root->val)return false;if(root->right&&root->right->val!=root->val)return false;return isUnivalTree(root->left)&&isUnivalTree(root->right);  }

递归图
在这里插入图片描述

当根和左右子树都相等的时候,就会一直递归左右子树,左右子树分别做根节点,和他的左右子树判断是否相等,当递归到叶子结点的左树,右树时,两个都会返回1,右侧中间的1,的左子树为空,右子树为1,左子树为空将会返回1,右子树为根,他的左右子树为空,返回1,树的根节点的左右子树返回两个1相与得到1,如此就可以判断得到结果,具体见上面的递归图.
#对称二叉树
题目描述
在这里插入图片描述
代码

  bool _isSymmetric(struct TreeNode* leftroot,struct TreeNode* rightroot) {if(leftroot==NULL&&rightroot==NULL)return true;if(leftroot==NULL||rightroot==NULL)return false;if(leftroot->val!=rightroot->val)return false;return _isSymmetric(leftroot->left,rightroot->right)&&_isSymmetric(leftroot->right,rightroot->left); 
}
bool isSymmetric(struct TreeNode* root) {
return  _isSymmetric(root->left,root->right);    
} 

在这里插入图片描述
在这里插入图片描述

#二叉树的前序遍历
在这里插入图片描述
代码

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

注意上述代码有些问题,我先来解释一下代码,然后在解决上述问题,
之前我们写过前序遍历,但是这个题不同的是需要将前序遍历的结果放到一个数组中并且返回这个数组,首先我们解决的问题是二叉树结点的个数问题,因为要创建同大小的数组,这里我们就需要使用求二叉树结点个数的函数,返回的结点个数用returnsize接收,
在这里插入图片描述
并且该数组需要自己创建,
在这里插入图片描述
如果在这个函数里面采用前序遍历的话,每次递归都会malloc,所以我们使用另一个函数来递归前序遍历,
在这里插入图片描述
在这里插入图片描述
给递归前序遍历函数传的参数分别有要遍历二叉树的根的地址,malloc来的数组首地址,以及数组的下标,具体的前序遍历在二叉树那一篇文章中有详细的解释,现在讲一下存在的问题
在这里插入图片描述
在这里插入图片描述
当进入数据为2的栈帧此时的i还是1,就会覆盖掉数据为1的栈帧写入a[1]=1;
现在的a[1]=2;由于在二叉树结点个数中已经知道有三个结点,于是就会将
(a+2)里面的随机值打印出来,具体解决办法,传下标的地址过去,用指针接收.
代码

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

#中序遍历
#后序遍历
这两个只需要修改位置即可
在这里插入图片描述
#另一颗子树
题目描述
在这里插入图片描述
代码实现

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)
return false;
if(isSameTree(root, subRoot))
return true;
return isSubtree(root->left, subRoot)||isSubtree(root->right, subRoot);
}

这里用到了相同的树的函数

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);
}

递归二叉树,分别以当前结点做根,与subRoot做比较,如果不同,就递归左右子树,如果左右子树中有与subroot为根的树相同的子树,就返回1,当根相同时,会调用函数isSameTree(struct TreeNode* p, struct TreeNode* q)比较左子树和右子树是否相同,如果刚开始root==NULL,肯定subroot不为子树返回false.建议大家画一下递归图会好理解很多。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【云原生】什么是 Kubernetes ?

什么是 Kubernetes ? Kubernetes 是一个开源容器编排平台,管理着一系列的 主机 或者 服务器,它们被称作是 节点(Node)。 每一个节点运行了若干个相互独立的 Pod。 Pod 是 Kubernetes 中可以部署的 最小执行单元&#x…

机器学习【03】在本地浏览器使用远程服务器的Jupyter Notebook【conda环境】

1.激活虚拟环境 conda activate 虚拟环境名字2.虚拟环境下安装jupyter notebook pip install jupyter3.配置 jupyter 文件 在 Jupyter Notebook 的配置目录中生成一个配置文件 jupyter_notebook_config.py jupyter notebook --generate-config3.设置密码 jupyter notebook …

性能压测工具:wrk

一般我们压测的时候,需要了解衡量系统性能的一些参数指标,比如。 1、性能指标简介 1.1 延迟 简单易懂。green:一般指响应时间 95线:P95。平均100%的请求中95%已经响应的时间 99线:P99。平均100%的请求中99%已经响应的时间 平…

JVM字节码文件的相关概述解读

Java全能学习面试指南:https://javaxiaobear.cn 1、字节码文件 从下面这个图就可以看出,字节码文件是可以跨平台使用的 想要让一个Java程序正确地运行在JVM中,Java源码就必须要被编译为符合JVM规范的字节码。 https://docs.oracle.com/java…

如何使用nginx部署静态资源

Nginx可以作为静态web服务器来部署静态资源,这个静态资源是指在服务端真实存在,并且能够直接展示的一些文件数据,比如常见的静态资源有html页面、css文件、js文件、图片、视频、音频等资源相对于Tomcat服务器来说,Nginx处理静态资…

Flutter桌面应用开发之毛玻璃效果

目录 效果实现方案依赖库支持平台实现步骤注意事项话题扩展 毛玻璃效果:毛玻璃效果是一种模糊化的视觉效果,常用于图像处理和界面设计中。它可以通过在图像或界面元素上应用高斯模糊来实现。使用毛玻璃效果可以增加图像或界面元素的柔和感,同…

Elasticsearch集群部署,配置head监控插件

Elasticsearch是一个开源搜索引擎,基于Lucene搜索库构建,被广泛应用于全文搜索、地理位置搜索、日志处理、商业分析等领域。它采用分布式架构,可以处理大规模数据集和支持高并发访问。Elasticsearch提供了一个简单而强大的API,可以…

超级详细的 Maven 教程(基础+高级)

1. Maven 是什么 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供构建和依赖管理支持的工具。 一个 Maven 工程有约定的目录结构,约定的目录结构对于 Maven 实现自动化构建而言是必不可少的一环,就拿自动编译来说,Maven 必须…

ArkTs变量类型、数据类型

可以参考官网学习路径学习HarmonyOS第一课|应用开发视频教程学习|HarmonyOS应用开发官网 一、变量 1、ArkTS语言 ArkTS是华为自研的开发语言。它在TypeScript(简称TS)的基础上,匹配ArkUI框架,扩展了声明式UI、状态管理等相应的…

赢麻了!义乌一个村有5000个网红,有人年收租就300万!

#义乌一村电商年成交额超300亿# ,在中国,电商行业的发展可谓是日新月异,而位于浙江省义乌市的江北下朱村,正是这股潮流的一个典型代表。这个村子,处处弥漫着“直播”的气息,仿佛每个人都在为这个新兴行业助力。 江北下…

Linux的基本指令(二)

目录 前言 学前补充 touch指令 mkdir指令 rmdir指令 rm指令 通配符* man指令 cp指令 mv指令(重要) 补充内容: 1、如何快速在Linux中写出代码 2、如何看待如此多的Linux指令 cat指令 前言 关于Linux的基本指令我们会分三到四篇文章进行分析&#xff0c…