当前位置: 首页 > news >正文

【二叉树】—— 算法题

一、单值二叉树

题目要求:判断二叉树是不是单值二叉树(就是所以节点的值都相等)。

思路:

利用二叉树的递归思想,判断每一个节点值与其左右子节点的值是否相等,如果遇到空节点,就返回true(说明每一个节点值都相等);如果遇到节点的值与其左右节点值不相等就返回false;如果该节点的值与其左右子节点的值都相等,就接着递归该节点的左右子树。

代码如下:

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

二、相同的树 — 对称二叉树 — 另一颗树的子树

2.1、相同的树

判断两个二叉树是否相等

思路:

同时遍历两个二叉树,如果遍历到两个二叉树节点同时为空,就说明这两个二叉树相同;如果其中一个为空而另一个不为空,就说明两个二叉树不相同;如果遍历过程中,遇到两个二叉树节点的值不相等,则两个二叉树不相同。

简单分析一下:

同时遍历这两个二叉树

两个二叉树节点都不为空且值相等,继续遍历其左子树

两个二叉树节点都不为空且值相等,继续遍历其左子树

两个二叉树节点都为空,返回true

先遍历二叉树是2节点的右节点,也为空,这里直接跳过了。

这里回退到1这个节点,接下来遍历1的右子树

遍历到节点都不为空,且值相等,继续遍历 (这因为3的左右节点都为空,就一步带过)

遍历结束,没有遇到一个节点为空一个节点不为空或者值不相等的情况,就返回true。

代码如下:

typedef struct TreeNode TreeNode; 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); }

2.2、对称二叉树

判断二叉树是否是对称二叉树,这里还是实现与上题相同的树类似的思路。

思路:

利用相同的树的方法,判断二叉树根节点的左右子树是否对称(判断对称直接判断一个节点的左子树和另一个节点的右子树是否相等即可)。

代码如下:

typedef struct TreeNode TreeNode; 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->right) && isSameTree(p->right, q->left); } bool isSymmetric(struct TreeNode* root) { return isSameTree(root->left,root->right); }

2.3、另一颗树的子树

判断一个树是否是另一个树的子树

思路:

还是利用相同二叉树的方法,判断二叉树及其左右子树中是否存在与另一棵树相同的树。

代码如下:

typedef struct TreeNode TreeNode; 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); }

三、二叉树的遍历(前序、中序、后序)

本题要求,前序遍历二叉树,并且返回前序遍历的结果(以数组方式返回),并且还用通过指向修改数据个数。

思路:

这里首先求二叉树的节点个数;然后动态申请内存来存储数据并且用来最后返回数组首元素地址;最后就是将数据存储到数组当中了,使用前序遍历。

代码如下:

typedef struct TreeNode TreeNode; int TreeSize(TreeNode* root) { if (root == NULL) { return 0; } return TreeSize(root->left) + TreeSize(root->right) + 1; } void _preorderTraversal(TreeNode* root,int* arr,int* pi) { if(root==NULL) { return ; } arr[(*pi)++]=root->val; _preorderTraversal(root->left,arr,pi); _preorderTraversal(root->right,arr,pi); } int* preorderTraversal(struct TreeNode* root, int* returnSize) { // 求出二叉树的节点个数 *returnSize =TreeSize(root); // 动态申请空间大小 int* returnArr=(int*)malloc(sizeof(int)*(*returnSize)); // 前序遍历 int i=0; _preorderTraversal(root,returnArr,&i); return returnArr; }

中序和后序遍历与其思路一样这里直接看代码。

中序遍历

typedef struct TreeNode TreeNode; int TreeSize(TreeNode* root) { if (root == NULL) { return 0; } return TreeSize(root->left) + TreeSize(root->right) + 1; } void _inorderTraversal(TreeNode* root,int* arr,int* pi) { if(root==NULL) { return ; } _inorderTraversal(root->left,arr,pi); arr[(*pi)++]=root->val; _inorderTraversal(root->right,arr,pi); } int* inorderTraversal(struct TreeNode* root, int* returnSize) { // 求出二叉树的节点个数 *returnSize =TreeSize(root); // 动态申请空间大小 int* returnArr=(int*)malloc(sizeof(int)*(*returnSize)); // 中序遍历 int i=0; _inorderTraversal(root,returnArr,&i); return returnArr; }

后序遍历

typedef struct TreeNode TreeNode; int TreeSize(TreeNode* root) { if (root == NULL) { return 0; } return TreeSize(root->left) + TreeSize(root->right) + 1; } void _postorderTraversal(TreeNode* root,int* arr,int* pi) { if(root==NULL) { return ; } _postorderTraversal(root->left,arr,pi); _postorderTraversal(root->right,arr,pi); arr[(*pi)++]=root->val; } int* postorderTraversal(struct TreeNode* root, int* returnSize) { // 求出二叉树的节点个数 *returnSize =TreeSize(root); // 动态申请空间大小 int* returnArr=(int*)malloc(sizeof(int)*(*returnSize)); // 中序遍历 int i=0; _postorderTraversal(root,returnArr,&i); return returnArr; }

四、二叉树的构建和遍历

创建二叉树,并且中序遍历。

因为这里题目说先序遍历字符串(我们根据这个来构建二叉树),本题要求写全部代码。

思路:

先创建字符数组,根据输入的字符串进行创建二叉树,创建完成以后再进行中序遍历输出即可。

代码如下:

#include <stdio.h> #include<stdlib.h> typedef struct BinaryTreeNode { char str; struct BinaryTreeNode* left; struct BinaryTreeNode* right; }BTNode; BTNode* BuyNode(char x) { BTNode* newnode=(BTNode* )malloc(sizeof(BTNode)); newnode->str=x; newnode->left=newnode->right=NULL; return newnode; } BTNode* CreatTree(char* str,int* pi) { if(str[*pi]=='#') { (*pi)++; return NULL; } BTNode* root=BuyNode(str[(*pi)++]); root->left=CreatTree(str,pi); root->right=CreatTree(str,pi); return root; } //中序遍历 void InOrder(BTNode* root) { if(root==NULL) { return; } InOrder(root->left); printf("%c ",root->str); InOrder(root->right); } int main() { char str[100]; scanf("%s",str); //根据字符创建二叉树 int i=0; BTNode* root=CreatTree(str, &i); InOrder(root); return 0; }

感谢各位大佬支持并指出问题,

如果本篇内容对你有帮助,可以一键三连支持以下,感谢支持!!!

http://www.jsqmd.com/news/598762/

相关文章:

  • 用JSP+Servlet实现图书管理系统:从登录验证到CRUD完整流程
  • 双馈风机次同步振荡抑制策略(一) 含 基于转子侧附加阻尼控制(SDC)的双馈风机次同步振荡抑制...
  • 如何为 Scala.js 编写自定义链接器插件:从零开始的完整指南
  • RWKV7-1.5B-G1A入门实操:GitHub代码仓库分析与总结生成
  • 基于Django的农场管理系统_5c4c39so_zl071
  • Android Init 系列专题【篇二:Selinux启动流程】
  • 如何高效解析小程序包?wxappUnpacker技术指南
  • 别再只会用了!PowerBI中CONCATENATEX函数实战:从动态标签到多值筛选器
  • PathPicker终极调试指南:快速解决5大常见错误与性能优化
  • 【CEEMDAN-VMD-GRU】完备集合经验模态分解-变分模态分解-门控循环单元预测研究附Python代码
  • 2026 BJ省选游记+题解
  • 01 飞腾 S5000C 服务器环境搭建实战:PyTorch + CUDA + RTX 4090D 安装与验证
  • NextFaster 电商数据库设计深度解析:从集合到产品的完整架构指南
  • 【3-5-3多项式】基于改进麻雀算法ISSA(混沌映射和粒子群PSO优化机械臂轨迹运行时间,机械臂规划轨迹研究附Matlab代码
  • Microsoft Agent Framework + Kimi API 实战:控制台应用跑通单次与多轮 Agent 对话
  • FPGA-图像处理实战:基于Sobel算子的实时边缘检测系统构建
  • 避开Trace API的坑:Android方法耗时统计的正确姿势与实战技巧
  • Blender 3MF插件:重新定义3D打印数据工作流
  • XUnity.AutoTranslator技术指南:从环境搭建到高级应用
  • 26年4月5日响课创始人李波在直播中针对GEO服务商避坑指南:主流机构优劣对比与选型测评做出详解 - 速递信息
  • 数据挖掘
  • 告别SCP!用trzsz+iTerm2实现服务器文件秒传(CentOS/Homebrew全流程实录)
  • Cocos使用firebase C++ SDK实现google登录
  • 终极实战指南:Godot PCK解包器深度解析与高效资源提取
  • 如何快速开始Cucumber.js:新手5步搭建第一个BDD测试项目
  • 学习日记
  • 2026年4月6日响课科技创始人李波首次披露响课GEO系统获多行业验证,无需专属技术团队也能高效实现全域流量占位 - 速递信息
  • Keil MDK调试时Watch窗口变量不刷新?别急,这3个设置项你检查了吗?
  • IDMPhotoBrowser:iOS开发者的终极照片浏览器解决方案
  • A*算法保姆级教程:从原理到Python实现,5分钟搞定最短路径问题