5.4二叉树——经典OJ题

2024-08-31 17:12
文章标签 二叉树 经典 oj 5.4

本文主要是介绍5.4二叉树——经典OJ题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本篇博客手撕几道经典的二叉树OJ题,它们都很好地体现了二叉树中蕴含的递归思想
题目均已插入超链接,点击即可跳转~

1. 单值二叉树

(1)题目描述

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。
只有给定的树是单值二叉树时,才返回 true;否则返回 false。

(2)题目分析

如果是空树,则return true,否则要比较左右子树各个结点的值与根节点的值是否相同
思想:递归思想——一棵树可以拆成根+左右子树,左右子树又可以拆成根+左右子树

(3)代码实现

bool isUnivalTree(struct TreeNode* root) 
{if(root==NULL){return true;//如果是空树,返回真}int standard=root->val;//记录一下根结点的值作为标准,与左子树和右子树的各节点进行比较if((root->left&&root->left->val!=standard) || (root->right&&root->right->val!=standard)){return false;//两个子节点中有一个不符合就返回false}return isUnivalTree(root->left)&&isUnivalTree(root->right);//确定左右子树都是单值二叉树  
}

2.相同的树

(1)题目描述

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例

(2)题目分析

思想:递归思想,拆成子问题
根和根比,左子树和左子树比,右子树和右子树比(对于整棵树及其任何子树都可以这么操作)

(3)代码实现

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 isSameTree(p->left, q->left)&&isSameTree(p->right, q->right);  return false;
}

变形:对称二叉树,读者可自行尝试。思路提示:根和根比,左子树和右子树比,右子树和左子树比

3.二叉树的前序遍历

(1)题目描述

给你二叉树的根节点 root ,返回它节点值的前序遍历。
注意:前序遍历结果要存到一个数组当中
示例

(2)题目分析

  • 关于returnSize:表示数组空间的大小,leetcode要求返回数组的大小,因此把returnSize的地址作为参数放到了函数接口处,函数执行过程中需要获得数组的大小,存入returnSize当中
  • 操作步骤:
    第一步:确定二叉树结点的个数,进而确定要开辟多大的数组
    第二步:对二叉树进行前序遍历,把遍历的结果放到预先开好的数组当中

(3)代码实现

 //返回一个数组,里面内容是前序遍历的结果,同时要返回数组的元素个数returnSize//前序遍历
int* prevOrder(struct TreeNode*root,int* a,int* pi)
{if(root==NULL)return NULL;a[*pi] = root->val;(*pi)++;prevOrder(root->left,a,pi);//遍历左子树prevOrder(root->right,a,pi);//遍历右子树return a;
}
//遍历树,确定节点个数,进而确定数组要开多大
int treeSize(struct TreeNode* root)
{if(root==NULL)//空结点,返回0return 0;if(root->left==NULL && root->right==NULL)//说明是叶子节点,返回1return 1;return treeSize(root->left)+treeSize(root->right)+1;//返回左子树结点数+右子树结点数+1
}
int* preorderTraversal(struct TreeNode* root, int* returnSize) 
{*returnSize = treeSize(root);//确定数组要建多大int* a = (int*)malloc(sizeof(int)*(*returnSize));int i = 0;a = prevOrder(root,a,&i);return a;
}

细节:每遍历到一个值放入数组之后,数组下标要+1,那就需要一个下标i来记录,每放入一个值,i就++。因此需要给前序遍历函数传i的地址,保证多次递归调用的时候都会对同一个i进行++操作,此处需要读者理解函数形参和实参的关系(形参是实参的一份临时拷贝),如果不传i的地址,那么前序遍历函数调用的时候,函数内部对i进行++操作不会影响实参的大小

这篇关于5.4二叉树——经典OJ题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1124496

相关文章

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

微积分-积分应用5.4(功)

术语“功”在日常语言中用来表示完成一项任务所需的总努力量。在物理学中,它有一个依赖于“力”概念的技术含义。直观上,你可以将力理解为对物体的推或拉——例如,一个书本在桌面上的水平推动,或者地球对球的向下拉力。一般来说,如果一个物体沿着一条直线运动,位置函数为 s ( t ) s(t) s(t),那么物体上的力 F F F(与运动方向相同)由牛顿第二运动定律给出,等于物体的质量 m m m 与其

PHP实现二叉树遍历(非递归方式,栈模拟实现)

二叉树定义是这样的:一棵非空的二叉树由根结点及左、右子树这三个基本部分组成,根据节点的访问位置不同有三种遍历方式: ① NLR:前序遍历(PreorderTraversal亦称(先序遍历)) ——访问结点的操作发生在遍历其左右子树之前。 ② LNR:中序遍历(InorderTraversal) ——访问结点的操作发生在遍历其左右子树之中(间)。 ③ LRN:后序遍历(PostorderT

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本

Leetcode面试经典150题-128.最长连续序列-递归版本另解

之前写过一篇这个题的,但是可能代码比较复杂,这回来个简洁版的,这个是递归版本 可以看看之前的版本,两个版本面试用哪个都保过 解法都在代码里,不懂就留言或者私信 class Solution {/**对于之前的解法,我现在提供一共更优的解,但是这种可能会比较难懂一些(思想方面)代码其实是很简洁的,总体思想如下:不需要排序直接把所有数放入map,map的key是当前数字,value是当前数开始的

力扣 739. 每日温度【经典单调栈题目】

1. 题目 理解题意: 1.1. 给一个温度集合, 要返回一个对应长度的结果集合, 这个结果集合里面的元素 i 是 当前 i 位置的元素的下一个更高温度的元素的位置和当前 i 位置的距离之差, 若是当前元素不存在下一个更高温度的元素, 则这个位置用0代替; 2. 思路 本题用单调栈来求解;单调栈就适用于来求当前元素左边或者右边第一个比当前元素大或者小的元素;【单调栈:让栈中的元素保持单调

在二叉树中找到两个节点的最近公共祖先(基于Java)

如题  题解 public int lowestCommonAncestor(TreeNode root, int o1, int o2) {//记录遍历到的每个节点的父节点。Map<Integer, Integer> parent = new HashMap<>();Queue<TreeNode> queue = new LinkedList<>();parent.put(roo

数据结构--二叉树(C语言实现,超详细!!!)

文章目录 二叉树的概念代码实现二叉树的定义创建一棵树并初始化组装二叉树前序遍历中序遍历后序遍历计算树的结点个数求二叉树第K层的结点个数求二叉树高度查找X所在的结点查找指定节点在不在完整代码 二叉树的概念 二叉树(Binary Tree)是数据结构中一种非常重要的树形结构,它的特点是每个节点最多有两个子节点,通常称为左子节点和右子节点。这种结构使得二叉树在数据存储和查找等方面具