二叉树(中等题)

1、先序,中序遍历确定二叉树

105

方法一、

前提

  • ① 必须不能有重复元素
  • ② 只有先序+中序后序+中序才能实现唯一树

思考要点:

  • 不要想着用for循环,递归一定更好解决
  • 输入是vector,递归就得考虑传入索引

class Solution {  
public:  // 辅助函数,构建子树  TreeNode* build_subTree(vector<int>& preorder, unordered_map<int, int>& inorder_map, int pre_st, int in_st, int in_end) {  // 如果当前中序遍历的起始位置大于结束位置,返回空指针  if (in_st > in_end) return nullptr;  // 创建根节点,使用前序遍历数组中的当前元素  TreeNode* root = new TreeNode(preorder[pre_st]);  // 获取当前根节点在中序遍历中的索引  int inorderRootIndex = inorder_map[preorder[pre_st]];   // 递归构建左子树  root->left = build_subTree(preorder, inorder_map, pre_st + 1, in_st, inorderRootIndex - 1);  // 递归构建右子树  root->right = build_subTree(preorder, inorder_map, pre_st + (inorderRootIndex - in_st) + 1, inorderRootIndex + 1, in_end);  // 返回构建好的子树根节点  return root;  }  // 主函数,构建二叉树  TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {  // 创建一个哈希表,用于快速查找中序遍历中每个值的索引  unordered_map<int, int> inorder_map;  for (int i = 0; i < inorder.size(); i++) {  inorder_map[inorder[i]] = i; // 存储每个节点值到其索引的映射  }  // 调用辅助函数构建树,初始始点为0,结束点为中序遍历的最后一个索引  return build_subTree(preorder, inorder_map, 0, 0, inorder.size() - 1);  }  
};  

2、中序,后序确定二叉树

在这里插入图片描述

和上文的思路相似。

/**  * Definition for a binary tree node.  * struct TreeNode {  *     int val;               // 节点的值  *     TreeNode *left;       // 左子树的指针  *     TreeNode *right;      // 右子树的指针  *     TreeNode() : val(0), left(nullptr), right(nullptr) {} // 默认构造函数  *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} // 带值构造函数  *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {} // 带值和左右子树构造函数  * };  */  
class Solution {  
public:  // 递归构建子树的辅助函数  TreeNode* buildsubtree(vector<int>& postorder, unordered_map<int,int>& inorder_map, int post_end, int in_st, int in_end) {  if (in_st > in_end) return nullptr; // 如果当前子树的中序范围无效,返回空指针  TreeNode* root = new TreeNode(postorder[post_end]); // 取后序遍历最后一个元素作为当前子树的根节点  int inorder_root_index = inorder_map[postorder[post_end]]; // 找到根节点在中序遍历中的索引  root->right = buildsubtree(postorder, inorder_map, post_end - 1, inorder_root_index + 1, in_end); // 递归构建右子树  root->left = buildsubtree(postorder, inorder_map, post_end - (in_end - inorder_root_index) - 1, in_st, inorder_root_index - 1); // 递归构建左子树  return root; // 返回当前构建的根节点  }  // 主函数,接受中序和后序遍历数组并返回构建的二叉树  TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {  unordered_map<int,int> inorder_map; // 用于存储中序遍历的元素及其索引  int len = postorder.size(); // 获取后序遍历数组的长度  for (auto i = 0; i < inorder.size(); i++) {  inorder_map[inorder[i]] = i; // 每个元素的值和对应的索引  }  return buildsubtree(postorder, inorder_map, len - 1, 0, len - 1); // 调用辅助函数从后序数组的最后一个元素开始构建树  }  
};

有相同点:

  • 均为分左右子树各自递归。
  • map都是由中序遍历来担任。只不过前序找根节点从前往后,后序则是从后往前

不同点:
前序是先构造左子树;
后序是先构造右子树。

root->right = buildsubtree(postorder, inorder_map, post_end - 1, inorder_root_index + 1, in_end); // 递归构建右子树  
root->left = buildsubtree(postorder, inorder_map, post_end - (in_end - inorder_root_index) - 1, in_st, inorder_root_index - 1); // 递归构建左子树  

3、二叉树展开为链表

114
在这里插入图片描述

二叉树展开成为链表

114
在这里插入图片描述

方法一、

用先序遍历方法将树读出先,这里要掌握先序读取树,其中就要应用到引用&,不然递归会爆内存,然后再进行建树

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:void front_read(TreeNode*root, queue<int>& next_one){if(root==nullptr)return;next_one.push(root->val);front_read(root->left,next_one);front_read(root->right,next_one);}void build_tree(TreeNode*root,queue<int>&front_num){if(front_num.size()>0){TreeNode* right_son = new TreeNode(front_num.front());root->right=right_son;front_num.pop();build_tree(root->right,front_num);}}void flatten(TreeNode* root) {if(root==nullptr)return;queue<int> front_num;front_read(root,front_num);root->left=nullptr;front_num.pop();  // 记得要把第一个去掉噢build_tree(root,front_num);}
};

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

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

相关文章

蓝思科技赋能灵伴科技:AI眼镜产能与供应链双升级

2月22日&#xff0c;蓝思科技宣布与AI交互领军企业杭州灵伴科技&#xff08;Rokid&#xff09;达成深度战略合作&#xff0c;通过整机组装与全产业链整合&#xff0c;为2025年全球AI眼镜出货量爆发式增长&#xff08;预计达400万-1200万台&#xff09;提供核心支撑。 双方合作通…

【C/C++】分隔链表 (leetcode T86)

核心考点预览&#xff1a;链表 &#xff08;双指针&#xff09; 技巧&#xff1a;虚拟头结点 题目描述&#xff1a; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应…

Lineageos 22.1(Android 15)Launcer简单调整初始化配置

一、前言 Launcer的初始化配置主要在如下的xml文件夹下&#xff0c;默认读取的5x5 这里我们把device_profiles调整一下&#xff0c;然后新建一个default_workspace_my.xml作为我们自己的配置就行。 二、配置 注意Lineageos 的Launcer是在lineageos/packages/apps/Trebuchet…

量子计算的基本运算:Hadamard 门、CNOT 门、Pauli 门详解

量子计算是现代计算科学的前沿领域,它与经典计算机在处理信息的方式上有着本质的区别。量子计算机利用量子比特(qubit)的叠加态和量子纠缠等特性来进行计算,从而在某些特定任务上超越传统计算机。量子计算的核心运算单元是量子门,它们通过作用于量子比特来操控量子状态。本…

Java 大视界 -- 国际竞争与合作:Java 大数据在全球市场的机遇与挑战(94)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

游戏引擎学习第113天

仓库:https://gitee.com/mrxiao_com/2d_game_2 黑板&#xff1a;优化的基本过程 在游戏编程中&#xff0c;优化是一个非常重要的学习内容&#xff0c;尤其是想要成为专业开发者时。优化的核心是理解代码的执行速度&#xff0c;以及如何提升其性能。在这个阶段&#xff0c;已经…

教师教学技能大赛流程方案及细则

为了适应高等教育的改革和我校的生存发展&#xff0c;进一步提升教师教学技能和教育教学能力&#xff0c;促进教师专业发展&#xff0c;提高教师综合素质&#xff0c;加强我校教师队伍建设&#xff0c;提高教育教学质量&#xff0c;举办青年教师教学技能大赛&#xff0c;特制订…

QML MouseArea 鼠标事件详解

鼠标区域是一个不可见的项目&#xff0c;通常与可见项目一起使用&#xff0c;以便为该项目提供鼠标处理。通过有效地充当代理&#xff0c;鼠标处理逻辑可以包含在MouseArea项中。 有关MouseArea和按钮单击的信息是通过为其定义事件处理程序属性的信号提供的。最常用的是处理鼠…

系统思考—结构影响行为

“付费是对价值的认可&#xff0c;它是承诺的体现&#xff0c;是我们共同走向未来的信任。” — 吉姆柯林斯 在组织中&#xff0c;结构的影响几乎无处不在。它不仅定义了我们的流程、职能和角色&#xff0c;更在不知不觉中塑造了我们日常的行为和决策方式。每一次决策、每一个…

嵌入式标志位解决程序卡顿问题

在写程序实现多个功能时发现会因为延时时间长导致其他功能程序无法运行问题 例如在写闹钟程序时&#xff0c;如果闹钟响灯亮5秒&#xff0c;这五秒期间会导致led显示的时间停止更细&#xff0c;等五秒过后直接显示5秒后正确的时间。这个因为程序是顺序运行的&#xff0c;延时时…

BFS算法解决最短路径问题(典型算法思想)—— OJ例题算法解析思路

目录 一、1926. 迷宫中离入口最近的出口 - 力扣&#xff08;LeetCode&#xff09; 算法代码&#xff1a; 代码分析 各个部分的解释 注意事项 整体的含义 具体情况 使用 e[0] 和 e[1] 的优势 总结 示例代码中的用法 整体流程 示例 复杂度分析 总结 二、433. 最小基…

《Europe From Above》鸟瞰欧洲(意境欧洲)@ 第三季

目录 第1集 爱尔兰克罗克公园灰海豹保护团队防风石墙无线电望远镜水产凤凰公园农业惊艳瞬间 第2集 挪威第3集 克罗地亚第4集 葡萄牙第5集 冰岛第6集 瑞士制作与播出信息 第1集 爱尔兰 本集聚焦爱尔兰的自然与人文交融&#xff1a; 克罗克公园 首都都柏林的克罗克公园&#x…

cs106x-lecture14(Autumn 2017)-SPL实现

打卡cs106x(Autumn 2017)-lecture14 (以下皆使用SPL实现&#xff0c;非STL库&#xff0c;后续课程结束会使用STL实现) 1、min Write a function named min that accepts a pointer to a ListNode representing the front of a linked list. Your function should return the …

【HeadFirst系列之HeadFirstJava】第4天之理解对象的行为:方法操作实例变量

理解对象的行为&#xff1a;方法操作实例变量 在《Head First Java》的第四章节中&#xff0c;作者深入探讨了对象的行为&#xff0c;即方法如何操作实例变量。这一章节的核心思想是&#xff1a;对象的行为由其方法定义&#xff0c;而方法通过操作实例变量来实现这些行为。理解…

自注意力机制和CNN的区别

CNN&#xff1a;一种只能在固定感受野范围内进行关注的自注意力机制。​CNN是自注意力的简化版本。自注意力&#xff1a;具有可学习感受野的CNN。自注意力是CNN的复杂形态&#xff0c;是更灵活的CNN&#xff0c;经过某些设计就可以变为CNN。 越灵活、越大的模型&#xff0c;需要…

网络运维学习笔记 012网工初级(HCIA-Datacom与CCNA-EI)某机构新增:GRE隧道与EBGP实施

文章目录 GRE隧道&#xff08;通用路由封装&#xff0c;Generic Routing Encapsulation&#xff09;协议号47实验&#xff1a;思科&#xff1a;开始实施&#xff1a; 华为&#xff1a;开始实施&#xff1a; eBGP实施思科&#xff1a;华为&#xff1a; GRE隧道&#xff08;通用路…

Mac m1 连接公司内网

1、创建VPN 1、在系统偏好设置 2、选择网络 3、进行添加 2、添加设置 1、选择VPN 2、类型选择L2TP/IPSec 3、填写服务器IP和账号 4、点击认证设置-填写密码 。然后应用 3、进行特殊配置 网上说苹果系统的问题。 1、创建命令 sudo vim /etc/ppp/options 2、添加内容-主要别…

【多模态处理篇七】【DeepSeek传感器融合:IMU+视觉SLAM方案】

大家好,今天我们来聊聊一个非常酷的技术——DeepSeek传感器融合:IMU+视觉SLAM方案。这个技术在现代机器人、自动驾驶、AR/VR等领域都有广泛的应用。我们将从基础概念开始,逐步深入到核心原理和实现细节,力求让大家对这个技术有一个全面而深入的理解。 1. 什么是SLAM? 首…

医疗报销系统的设计与实现(代码+数据库+LW)

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理&#xff0c;然而&#xff0c;随着近些年信息技术的迅猛发展&#xff0c;让许多比较老套的信息管理模式进行了更新迭代&#xff0c;报销单信息因为其管理内容繁杂&#xff0c;管理数量繁多导致手工进行处理不能满足…

LangChain 技术入门指南:探索语言模型的无限可能

在当今的技术领域&#xff0c;LangChain 正逐渐崭露头角&#xff0c;成为开发语言模型应用的强大工具。如果你渴望深入了解并掌握这一技术&#xff0c;那么就跟随本文一起开启 LangChain 的入门之旅吧&#xff01; (后续将持续输出关于LangChain的技术文章,有兴趣的同学可以关注…