力扣二叉树题解含思路(C++实现)

1.求二叉树的最近公共祖先:

        原题链接:. - 力扣(LeetCode)

        假设这题的p,q分别为7和8,而它们的最近公共祖先肯定是为3。

这题我们大致的思路为保存p,q的绝对路径,接着通过存储的绝对路径去寻找第一个相同的节点假设公共节点。

        1.1:寻找7节点:

        

                1.2:8节点也是同样的方式进行:

        1.3:找到最近的公共节点

                

        代码:

class Solution {
public:bool Find(TreeNode* root,TreeNode* val,stack<TreeNode*>&st){if(!root)return false;st.push(root);if(root==val)return true;if(Find(root->left,val,st))return true;if(Find(root->right,val,st))return true;//如果此时的节点的根,左子树,右子树都没有找到val,就说明val并不在这个节点,将这个节点pop掉。st.pop();return false;        }TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q){//1.使用两个栈用来保存p,q的绝对路径//2.接着pop较长的栈,保持两个栈相等//3.两个栈同时pop,最终得到相等的就是祖先stack<TreeNode*> st1;stack<TreeNode*> st2;Find(root,p,st1);Find(root,q,st2);while(st1.size()>st2.size())st1.pop();while(st2.size()>st1.size())st2.pop();while(st1.top()!=st2.top()){st1.pop();st2.pop();}return st1.top();}
};

2.二叉搜索树与双向链表

        原题链接:二叉搜索树与双向链表_牛客题霸_牛客网

        其实这题如果忽略题目要求就很简单,因为是标准的搜索二叉树,就通过中序遍历存入list题目就解决了,但小编应题目要求,空间复杂度为O(1)及在原树上操作。本题需要对递归有一定的理解才方便做。

        

        这里小编要提出一个穿越者思想,及把自己想象成一个可以穿越时间的人,而二叉树有left和right与根。将left想象成昨天,将right想象成明天。因为是搜索二叉树所以必然会走一个中序遍历,所以我们将在中序遍历上进行操作。

        条件1:我们知道昨天发生什么

        条件2:我们虽然不知道明天将发生什么,但我们穿越到明天后再回到今天就能知道明天发生什么。

        

        这里小编想多一嘴,为什么cur会回到6节点,因为我们采用的方式是递归,递归函数会进行压栈,当我们压入4节点的函数栈帧时候,6节点栈帧会保存在4节点下面,而当4节点函数结束时候,此时函数栈帧进行弹出销毁,6节点就是栈顶,所以此时cur的值就是6.而且因为递归的关系,就算指向改变了也不会影响中序遍历的顺序,因为已经将顺序全部压入栈中了。

                

        代码:

class Solution {
public:bool TrainsTree(TreeNode*&prev,TreeNode*cur){if(cur==nullptr)return false;TrainsTree(prev,cur->left);cur->left=prev;if(prev)prev->right=cur;prev=cur;TrainsTree(prev, cur->right);return true;}TreeNode* Convert(TreeNode* pRootOfTree){TreeNode*prev=nullptr;TrainsTree(prev, pRootOfTree);TreeNode*head=pRootOfTree;while (head&&head->left) {head=head->left;}return  head;}
};

       代码看着很简单,就只是在改动指针之间的指向,但这就是递归的魅力,看着很简单,实际想出来很难。

3.从前序和中序遍历序列构建二叉树

        原题链接:105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

        

        题目要求给定两个二叉树序列的数组,要求我们从两个序列中构建二叉树,那么我们先从画图思考如何构建。  

        代码:

class Solution {
public:TreeNode*_build(vector<int>& preorder, vector<int>& inorder,int &pi,int ileft ,int iright ){if(ileft>iright)return nullptr;//使用前序遍历思想,进来就先确定根TreeNode *key=new TreeNode(preorder[pi]);//使用中序遍历思想,找到根,区分根的左子树与右子树int keyi=0;while(keyi<inorder.size()){if(inorder[keyi]==preorder[pi])break;keyi++;}pi++;//[ileft keyi-1] keyi [keyi+1 iright];key->left=_build(preorder,inorder,pi,ileft,keyi-1);key->right=_build(preorder,inorder,pi,keyi+1,iright);return key;}TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder){int pi=0, ileft=0 , iright=inorder.size()-1;return _build(preorder,inorder,pi,ileft,iright);}
};

        代码递归结束条件为ileft大于iright,就好比如我们想确定9是不是属于叶子节点,在递归9的左子树时,ileft=0,iright=-1,而在递归9的右子树时候会发现ileft=1,而iright=0。这显然不是一个有效的区间所以直接退出。

4.二叉树的前序遍历

        原题链接:144. 二叉树的前序遍历 - 力扣(LeetCode)

        可能看到这有读者疑惑,这题不是很简单吗,为啥还需要拿出来讲。是的这题使用递归的思想就是很简单,但如果要求采用的是非递归的方式呢?应该怎么做

        

        

        假设我们需要前序遍历这颗子树应该怎么遍历呢?

        

        因为是前序遍历,所以我们在一开始遍历根的时候直接将值存入vector中,在将节点压入栈中。

        这里主要的核心是通过栈的先进先出的特性来模拟递归遍历的过程,当我们的cur指针只需要一直往左子树遍历。用栈去存储节点,当cur指向空的时候表明该根的左子树已经遍历完成,接着弹出栈顶节点,如果栈顶节点没有右节点就不用管,继续弹出下一个栈顶节点,而如果弹出的栈顶节点有右子树,那么我们就重新让cur指向我们弹出节点的右节点,接着继续遍历入栈循环。直到栈为空与cur指向为空,就表明该子树全部遍历完成了。

        代码:

    vector<int> preorderTraversal(TreeNode* root){vector<int> vv;stack<TreeNode*> st;TreeNode *cur=root;TreeNode *temp=nullptr;while(cur||!st.empty()){if(cur){vv.push_back(cur->val);st.push(cur);cur=cur->left;}else{temp= st.top();st.pop();cur=temp->right;  }}return vv;}

        

5.二叉树的后序遍历

        原题链接:145. 二叉树的后序遍历 - 力扣(LeetCode)

        这题我们就以这颗二叉树为例,我们直到后序遍历为:左子树|右子树|根 而很显然在后序遍历的时候根节点会被访问两次,所以这题我们会两次访问根节点,而难点在于我们并不知道我们的右子树是否已经访问过了.

                

        代码:

 vector<int> postorderTraversal(TreeNode* root){vector<int> vv;stack<TreeNode*> st;TreeNode *cur=root;TreeNode *temp=nullptr;TreeNode*prev=nullptr;while(cur||!st.empty()){while(cur){st.push(cur);cur=cur->left;}//后序遍历二叉树会走两次根节点,//如果一个根的右节点没被访问,那么访问根的前一个节点为根的左子树//如果一个根的右子树被访问了,那么访问根的前一个节点为根的右子树temp=st.top();if(temp->right==nullptr || prev==temp->right){vv.push_back(temp->val);st.pop();prev=temp;}else{cur=temp->right;}}return vv;}

                                

                                                                                                那么本片文章到这里就结束了,感谢各位观看,如果觉得对您有帮助,还请点点赞

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

稀硫酸介质中 V 型球阀的材质选择与选型要点-耀圣

稀硫酸介质中 V 型球阀的材质选择与选型要点 在工业生产中&#xff0c;稀硫酸是一种常见的化学介质&#xff0c;对于输送和控制稀硫酸的阀门&#xff0c;正确的材质选择和选型至关重要。本文将介绍稀硫酸介质中 V 型球阀的材质选择&#xff0c;并提供一些选型的要点。 一、稀硫…

.NET6中WPF项目添加System.Windows.Forms引用

.NET6中WPF项目添加System.Windows.Forms引用 .NET6的WPF自定义控件默认是不支持System.Windows.Forms引用的&#xff0c;需要添加这个引用方法如下&#xff1a; 1. 在项目浏览器中找到项目右击&#xff0c;选择编辑项目文件&#xff08;Edit Project File&#xff09;。 …

【后端速成Vue】computed计算属性

前言&#xff1a; 本期将会介绍 Vue 中的计算属性&#xff0c;他和 methods 方法又会有什么区别呢&#xff1f;在这里都会给你一一讲解。 篮球哥找工作专属IT岗位内部推荐&#xff1a; 专属内推链接&#xff1a;内推通道 1、computed计算属性 概念&#xff1a; 基于现有的数据…

【论文笔记】The Power of Scale for Parameter-Efficient Prompt Tuning

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: The Power of Scale for P…

前端入门一之BOM、window对象常见事件、定时器、JS执行机制、location对象、navigatior对象、history对象

前言 JS是前端三件套之一&#xff0c;也是核心&#xff0c;本人将会更新JS基础、JS对象、DOM、BOM、ES6等知识点&#xff0c;这篇是BOM;这篇文章是本人大一学习前端的笔记&#xff1b;欢迎点赞 收藏 关注&#xff0c;本人将会持续更新。 文章目录 BOM1、BOM概述2、window对象…

LeetCode 56.合并区间

思路&#xff1a; 类似于用最少的箭射气球题目&#xff0c;最主要是要处理区间之间是否有重叠&#xff0c;如果无重叠则加入数组&#xff0c;如果有重叠&#xff0c;则需要重新设判断的边界&#xff0c;与下一个区间继续判断。 难点在于 代码用法 需熟练掌握 思想简单&#…

14.UE5爆炸伤害,场景变暗,时间轴

2-16 爆炸伤害&#xff0c;球体监测&#xff0c;场景变暗、时间轴_哔哩哔哩_bilibili 目录 1.UE5的爆炸伤害 ​2.后期盒子实现场景变暗 1.UE5的爆炸伤害 进入流星火雨的发射物蓝图编辑器中 对我们以前的重叠事件进行回顾&#xff0c;并修改使之实现爆炸伤害的效果 这是我们…

现代无线通信接收机架构:超外差、零中频与低中频的比较分析

写在前面&#xff1a;本博客是对三种接收机架构的学习笔记&#xff0c;仅供个人学习记录使用。内容主要是上网查阅的资料&#xff0c;以及个人的一些理解。如有错误的地方请指出&#xff01; 文章目录 一、通信机基本架构1、射频发射级的基本组成及完成功能2、射频接收级的基本…

工业4.0时代下的人工智能新发展

摘要&#xff1a;随着德国工业4.0时代以及中国制造2025的提出&#xff0c;工业智能化的改革的时代正逐渐到来&#xff0c;然而我国整体工业水平仍然处于工业2.0水平。围绕工业4.0中智能工厂、智能生产、智能物流这三大主题&#xff0c;结合国内外研究现状&#xff0c;对人工智能…

[ Linux 命令基础 5 ] Linux 命令详解-网络管理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

计算机课程管理:Spring Boot实现的工程认证解决方案

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了基于工程教育认证的计算机课程管理平台的开发全过程。通过分析基于工程教育认证的计算机课程管理平台管理的不足&#xff0c;创建了一个计算机管理基于工程教育认…

【eNSP】企业网络架构链路聚合、数据抓包、远程连接访问实验(二)

一、实验目的 网络分段与VLAN划分&#xff1a; 通过实验了解如何将一个大网络划分为多个小的子网&#xff08;VLAN&#xff09;&#xff0c;以提高网络性能和安全性。 VLAN间路由&#xff1a; 学习如何配置VLAN间的路由&#xff0c;使不同VLAN之间能够通信。 网络设备配置&am…

Ubuntu 的 ROS 2 操作系统安装与测试

引言 机器人操作系统&#xff08;ROS, Robot Operating System&#xff09;是一种广泛应用于机器人开发的开源框架&#xff0c;提供了丰富的库和工具&#xff0c;支持开发者快速构建、控制机器人并实现智能功能。 当前&#xff0c;ROS 2 的最新长期支持版本为 Humble Hawksbil…

软件工程笔记一

目录 软件的概念、特性和分类 软件与程序 软件的特性 软件的分类 软件危机与软件工程 软件危机 如何摆脱软件危机? 软件工程概念的提出 什么是软件工程&#xff1f; 软件工程的若干定义 系统工程的目标 软件工程的基本原理 软件工程的目标 软件的质量特性 软件生存…

CEO代码 (CEO Code)

https://caseinterview.com/wp-content/uploads/2015/10/The-CEO-Code-Rules-by-Victor-Cheng.pdf 源自 Victor Cheng CEO们使用一种特殊的语言。这种语言不是英语、西班牙语、普通话或印地语&#xff0c;而是一种置于我们日常语言之上的元语言。 CEO们很快就能识别出谁能说这…

LVGL实现冒泡事件

在LVGL&#xff08;LittlevGL&#xff09;中&#xff0c;事件冒泡是一个重要的概念&#xff0c;它允许事件从一个对象传递到其父对象&#xff0c;直到找到一个能够处理该事件的对象或者达到顶层对象。以下是如何在LVGL中实现和使用事件冒泡的概述&#xff1a; 事件冒泡的理解 …

深入理解计算机系统-信息的表示和处理

2.1 信息存储 大多数计算机使用8位的块&#xff0c;或者字节&#xff0c;作为最小的可寻址的内存单位&#xff0c;而不是访问内存中单独的位。机器级程序将内存视为一个非常大的字节数组&#xff0c;称为虚拟内存。 内存的每个字节都由一个唯一的数字来表示&#xff0c;称为它的…

JAVA-顺序表ArrayList(实现ArrayList)

1.线性表 线性表 &#xff08; linear list &#xff09; 是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列... 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。…

DCN DCWS-6028神州数码 AC 设备配置笔记

DCN DCWS-6028神州数码 AC 设备配置笔记 一、前期准备 PC 电脑网络配置 目的:使 PC 能够访问 AC 的 web 管理控制台。配置详情:web 管理控制台地址为 192.168.1.10,将 PC 电脑 IP 地址配置在 192.168.1.1 - 192.168.1.254 网段内,如 192.168.1.110,子网掩码 255.255.255.…

树概念及结构

树概念及结构 6.1 树概念及结构6.1.1 树的概念6.1.2 树的术语解读6.1.3 树的表示 6.1 树概念及结构 6.1.1 树的概念 类似八股文一样的东西&#xff0c;需要记一下。 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系…