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

数据结构与算法再探(三)树

目录

二叉树

二叉树遍历

C++ 递归

C++迭代

 python递归

层次遍历

二叉树的最大深度及直径

python 版递归树深度

递归求宽度

反转二叉树

python递归实现

 代码可视化


二叉树

二叉树遍历

C++ 递归

通过调用自身来解决问题,将原问题分解为一个或多个规模较小的相似子问题,在函数体内调用自身来解决问题。递归算法需要定义基本情况(边界条件),以防止无限递归。

class Solution {
public:void preorder(TreeNode *root, vector<int> &res) {if (root == nullptr) {return;}res.push_back(root->val); #先根preorder(root->left, res);// res.push_back(root->val); #中preorder(root->right, res);//res.push_back(root->val); #后}vector<int> preorderTraversal(TreeNode *root) {vector<int> res;preorder(root, res);return res;}
};

C++迭代

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res;if (!root) {return res;}stack<TreeNode*> stk;stk.push(root);while (stk.size()) {auto node = stk.top();stk.pop();res.push_back(node->val);if (node->right) {stk.push(node->right);}if (node->left) {stk.push(node->left);}}return res;}
};

 python递归

class Solution:def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:def dfs(root):if not root:returnres.append(root.val) #改变位置进行先、中、后、遍历dfs(root.left)dfs(root.right)res=[]dfs(root)return res

层次遍历

637. 二叉树的层平均值 - 力扣(LeetCode)

vector<double> averageOfLevels(TreeNode* root) {vector<double> ans;if(!root){return ans;}queue<TreeNode*> q;q.push(root);while(!q.empty()){int count=q.size();double sum=0;for(int i=0;i<count;++i){TreeNode* node=q.front();q.pop();sum+=node->val;if(node->left){q.push(node->left);}if(node->right){q.push(node->right);}}ans.push_back(sum/count);}return ans;
}

二叉树的最大深度及直径

python 版递归树深度

递归虽然简洁但是有时难以写出和理解,每一次的递归调用都是一次完成函数的调用,需要梳理在递归临界点返,和返回后函数继续执行后最后,还要梳理回到上一次的递归调用节点间继续调用,着实难以理解,但是递归很多适用于树的操作。

class Solution:def maxDepth(self, root: Optional[TreeNode]) -> int:if root is None:return 0ld=self.maxDepth(root.left)rd=self.maxDepth(root.right)return max(ld,rd)+1
#递归子问题返回结果给上一级,不能陷入直观上的顺序执行,return max(ld,rd)+1却决于左右子树是否
#有节点,这个返回值第一次返回时也许经历了很多次的函数压栈,多次调用

递归求宽度

543. 二叉树的直径

class Solution:def diameterOfBinaryTree(self, root: Optional[TreeNode]) -> int:self.res=0def dfs(root):if not root: return 0ld=dfs(root.left)rd=dfs(root.right)self.res=max(self.res,ld+rd)return max(ld,rd)+1dfs(root)return self.res

反转二叉树

翻转二叉树

python递归实现

class Solution:def flipTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:if not root:returntemp=root.leftroot.left, root.right=self.flipTree(root.right),self.flipTree(temp)return root

 代码可视化

通过可视化发现为什么临时变量保存左节点,以及临时变量在递归中的变化

 代码可视化
 


http://www.mrgr.cn/news/81068.html

相关文章:

  • 【cursor破解】【cursor白嫖】
  • 面向对象程序设计-实验3
  • 22.3、IIS安全分析与增强
  • 多光谱成像技术在华为Mate70系列的应用
  • 【正点原子K210连载】第六十七章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • 适配器模式(Adapter)
  • dockerfile文档编写(2):docker pull、apt install和pip镜像加速
  • EdgeX Core Service 核心服务之 Core Command 命令
  • xiaomiR4c openwrt
  • 2.6 网络面试问题
  • 音视频入门基础:AAC专题(13)——FFmpeg源码中,获取ADTS格式的AAC裸流音频信息的实现
  • strongswan测试证书生成
  • css
  • CDN信息收集(小迪网络安全笔记~
  • FLV视频封装格式详解
  • dockerfile文档编写(3):构建失败后清理缓存(删除容器和镜像相关命令)
  • Day13 用Excel表体验梯度下降法
  • 某狐畅游24校招-C++开发岗笔试(单选题)
  • 一起学Git【番外篇:如何在Git中新建文件】
  • 【全栈开发】----用pymysql库连接MySQL,批量存入
  • Vue3:uv-upload图片上传
  • 数智化医院分布式计算框架融合人工智能方向初步实现与能力转换浅析
  • SpringBoot使用 AOP 实现自定义日志记录并保存在Mysql
  • UITableView实现通讯录效果
  • javaEE-多线程编程-3
  • 某政银行APP登陆逆向