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

【数据结构】二叉树经典OJ题与OJ题解析

1. 单值二叉树

​​​​​​965. 单值二叉树 - 力扣(LeetCode)

bool isUnivalTree(struct TreeNode* root) {// 当前树if(root == NULL)return true;if(root->left && root->val != root->left->val)return false;if(root->right && root->val != root->right->val)return false;// 递归判断左右子树return isUnivalTree(root->left) && isUnivalTree(root->right);
}

2. 二叉树的最大深度

104. 二叉树的最大深度 - 力扣(LeetCode)

int max(int a,int b)
{if(a>b)return a;elsereturn b;
}
// 当前深度为 max(左子树深度,右子树深度)+1
int maxDepth(struct TreeNode* root) {if(root == NULL)return 0;return max(maxDepth(root->left),maxDepth(root->right))+1;
}

3. 翻转二叉树

226. 翻转二叉树 - 力扣(LeetCode)

struct TreeNode* invertTree(struct TreeNode* root) {if(root == NULL)return NULL;// 左右交换struct TreeNode* tmp = root->left;root->left = root->right;root->right = tmp;invertTree(root->left);invertTree(root->right);return root;
}

4. 相同的树

100. 相同的树 - 力扣(LeetCode)

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {// 都为空返回trueif(p == NULL && q == NULL)return true;// 一个为空一个不为空返回falseif((p == NULL && q != NULL) || (p != NULL && q == NULL))return false;// 子树都返回true且当前节点值都相同才返回truereturn isSameTree(p->left,q->left) && isSameTree(p->right,q->right) && (p->val == q->val);
}

5.另一棵树的子树

572. 另一棵树的子树 - 力扣(LeetCode)

bool isSameTree(struct TreeNode* p, struct TreeNode* q) {// 都为空返回trueif(p == NULL && q == NULL)return true;// 一个为空一个不为空返回falseif((p == NULL && q != NULL) || (p != NULL && q == NULL))return false;// 子树都返回true且当前节点值都相同才返回truereturn isSameTree(p->left,q->left) && isSameTree(p->right,q->right) && (p->val == q->val);
}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);
}

6.平衡二叉树

110. 平衡二叉树 - 力扣(LeetCode)

原思路:

int TreeDepth(struct TreeNode* root)
{if(root == NULL)return 0;return max(TreeDepth(root->left),TreeDepth(root->right))+1;
}// 最好情况是O(N),最坏情况是O(N*N)
// 能不能优化到最坏情况O(N)?
bool isBalanced(struct TreeNode* root) {if(root == NULL)return true;if(abs(TreeDepth(root->left) - TreeDepth(root->right)) > 1)return false;elsereturn isBalanced(root->left)&&isBalanced(root->right);
}

优化:

上面的代码是在用前序判断,有大量的计算高度重复,第一个根节点中已经递归计算了左子树的高度,然后到左孩子的时候又计算了一遍左子树的高度,重复了。

如果我们使用后序判断,第一个根节点的左和右的差我先不判断,我先判断我的左子树的左和右,到了左孩子,我继续不判断,继续左子树,一直到空。

bool _isBalanced(struct TreeNode* root, int* pDepth)
{if(root == NULL){*pDepth = 0;return true;}else{int leftDepth = 0;int rightDepth = 0;// 先判断左树,判断不过直接返回if(_isBalanced(root->left,&leftDepth) == false)return false;// 再判断右树,判断不过直接返回if(_isBalanced(root->right,&rightDepth) == false)return false;// 最后判断自己if(abs(leftDepth - rightDepth) > 1)return false;*pDepth = max(leftDepth,rightDepth) + 1;return true;}
}bool isBalanced(struct TreeNode* root) {int depth = 0;return _isBalanced(root,&depth);
}

7.二叉树遍历

​​​​​​二叉树遍历_牛客题霸_牛客网

typedef struct TreeNode
{char val;struct TreeNode* left;struct TreeNode* right;
}TreeNode_t;// 中序遍历
void InOrder(TreeNode_t* root)
{if(root == NULL){return;}else{InOrder(root->left);printf("%c ",root->val);InOrder(root->right);}
}// 构建二叉树
TreeNode_t* creatTree(char* str,int* pi)
{if(str[*pi] == '#'){(*pi)++;return NULL;}else {TreeNode_t* root = (TreeNode_t*)malloc(sizeof(TreeNode_t));root->val = str[*pi];(*pi)++;root->left = creatTree(str,pi);root->right = creatTree(str,pi);return root;}}int main() {char str[100];scanf("%s",str);int i = 0;TreeNode_t* root = creatTree(str,&i);InOrder(root);return 0;
}

http://www.dtcms.com/a/327137.html

相关文章:

  • 【传奇开心果系列】Flet框架实现的多人访问web数据表高并发前后端自定义框架模板
  • iPhone 17 Pro 为何被指像充电宝?
  • 【2025最新版】视频转换软件VideoProc Converter Al 便携版 功能强大的视频转换工具 百度网盘
  • iPad 引导式访问(Guided Access)完整指南
  • 26 届秋招建议指南
  • Web 安全之互联网暴露面管理
  • python调研本地 DeepSeek API的例子
  • Java 22 新特性:字符串模板(String Templates)让拼接更优雅、更安全
  • iOS混淆工具有哪些?团队协作视角下的分工与防护方案
  • 飞算JavaAI 2.0.0深度测评:自然语言编程如何重塑Java开发范式
  • 给商品换背景--指令改图,主图场景随心换
  • 【Allegro SKILL代码解析】添加Pin Number
  • NetworkManager配置热点
  • Springboot注册过滤器的三种方式(Order 排序)
  • 如何用codeBuddy20分钟处理一单数据分析
  • 10. React组件间的通信
  • MySQL——MySQL引擎层BufferPool工作过程原理
  • K8s 1.32.6版本部署文档
  • Ansible 基础到实操笔记
  • 【Redis在数据治理与数据隐私保护策略中的优化】
  • 新手向:Python编写简易翻译工具
  • 移动端调用大模型详解
  • 【运维进阶】Ansible 自动化
  • 西门子 S7-200 与 S7-1200 借 PPI 以太网模块通讯,赋能食品行业进步
  • 【pxe】通过pxe批量安装centos系统(传统Legacy启动+uefi启动)
  • Neo4j Cypher语句
  • 淘宝API列表:高效获取商品详情图主图商品视频参数item_get
  • 微前端 + Docker + Kubernetes 运作机制
  • 【51单片机定时器流水灯】2022-10-28
  • Docker使用----(安装_Windows版)