首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

二叉树前序遍历 、二叉树最大深度、平衡二叉树二叉树遍历【LeetCode刷题日志】

否则,返回左子树节点数、右子树节点数和1(表示当前节点)总和。 /** * Definition for a binary tree node....,都要把i初始化 //如果没有初始化,则i会一直叠加,无法重复使用 i = 0; // 调用TreeSize函数计算二叉树节点数 int size = TreeSize...二叉树 最大深度 是指从根节点到最远叶子节点最长路径上节点数。 /** * Definition for a binary tree node....本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点 左右两个子树高度差绝对值不超过 1 。 /** * Definition for a binary tree node....,不是InOeder(这里有一个拼写错误) { if (root == NULL) // 如果节点为空,直接返回 return; InOrder(root

13710

【愚公系列】2023年11月 数据结构(八)-二叉树

4.1 完美二叉树二叉树是一种特殊二叉树,每个节点要么没有子节点(为叶子节点),要么有两个子节点,且所有叶子节点都在同一层级上。...5.二叉树遍历5.1 层序遍历二叉树层序遍历是二叉树一种遍历方式,也叫广度优先遍历。它按照从上到下、从左到右顺序遍历二叉树所有节点,可以得到二叉树所有节点层次信息。...空间复杂度为 $O(w)$,其中 $w$ 是二叉树最大宽度。因为在最坏情况下,队列中存储节点数最多不会超过二叉树最大宽度,即二叉树最后一层节点数。...它特殊之处在于,对于每个节点,它子树所有节点值都小于它本身值,子树所有节点值都大于它本身值。因此,二叉搜索树可以用来实现动态查找、插入和删除操作。...表达式树:它是一种二叉树,用于表示一个算术表达式。每个叶节点表示一个操作数,每个内部节点表示一个运算符。表达式树可以用于计算表达式值。

25512
您找到你想要的搜索结果了吗?
是的
没有找到

golang刷leetcode 恢复二叉搜索树

二叉搜索树中两个节点被错误地交换。 请在不改变其结构情况下,恢复这棵树。...解题思路: 1,二叉树性质:左子树<根<小于右子树 2,如果中序遍历二叉树就能得到一个递增序列 3,由于只交换了两个位置,假设这两个位置为first,second,则first左边小于first,右边大于...first,second左边都小于second,只需交换first,second位置即可 4,如何得到递增序列?...中序遍历 5,用pre记录中序遍历上一个位置,如果pre.val>cur.val说明pre位置放错了,用first,second 记录两个位置,最好交换即可 6,注意,由于使用了全局指针,所以,使用前一定要初始化...,否则结果很奇怪 /** * Definition for a binary tree node

17110

每天一道剑指offer-重建二叉树

中序序列特点是先是左子树中序序列,然后是根结点,最后是右子树中序序列。...因此我们可以通过先序序列得到根结点,然后通过在中序序列中查找根结点索引从而得到子树和右子树结点数。...递归体定义,如上图先序序列子树序列是 2,3,4对应下标 1,2,3,中序序列子树序列是 3,2,4对应下标 0,1,2,因此递归体接收参数除了保存两个序列数组之外,还需要指明需要递归重建子序列分别在两个数组中索引范围...你看这种情况,上述错误代码还适用吗?原因就在于 index是在 in m~n中选取,与数组 in是绑定,和 pre没有直接关系,因此如果用 index来表示 i',j'自然是不合理。...比如二叉树问题,我们通常将其划分成头结点、左子树、右子树。 对于递归过程参数对应关系,尽量使用和数据样本本身没有直接关系变量来表示。

30610

【C++&数据结构】二叉树(结合C++)经典oj例题 (24)

/ 2)题目逐过程分析&完整代码 主要思路是通过 前序遍历 (根->左子树->右子树)方式遍历二叉树 我们可以利用 容器string & += 追加字符【( 】【 )】 于是我们得到下面所示基本代码...二.给定一个二叉树, 找到该树中两个指定节点最近公共祖先 1)题目介绍&oj链接 题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree...分别为节点在左还是在右返回值;利用下图所示简单逻辑判断,快速得到返回值 开始进行递归判断;两个节点,同时在左时,则继续往左走;同时在右时,继续往右走;直到一左一右,递归结束; 3)题目完整代码...TreeNode路径 最后分别对两个栈中存储路径大小进行比较,大路径挨个出栈,直到大小相同 同时出栈,最后返回公共祖先 5)方法2完整代码 三.二叉树搜索树转换成排序双向链表 1)题目介绍...根据第2步找到rooti, 划分左右区间 ,在左子树与右子树中进行递归操作 3)题目完整代码 4)对比同类型题目:“根据一棵树中序遍历与后序遍历构造二叉树” 后序遍历和前序遍历不同点在于,其访问根先后顺序完全颠倒

14910

​LeetCode刷题实战545:二叉树边界

今天和大家聊问题叫做二叉树边界,我们先来看题面: https://leetcode-cn.com/problems/boundary-of-binary-tree/ Given a binary tree...给定一棵二叉树,以逆时针顺序从根开始返回其边界。边界按顺序包括左边界、叶子结点和右边界不包括重复结点。(结点值可能重复) 左边界定义是从根到最左侧结点路径。...右边界定义是从根到最右侧结点路径。若根没有子树或右子树,则根自身就是左边界或右边界。注意该定义只对输入二叉树有效,而对子树无效。...Bottom所有都要加入其中。 rightBound也是如此。 我们可以循环调用dfs,初始化leftBound和rightBound两个boolean参数,一层层判断。...先加入左边,加入bottom,然后得到两个子树加入,最后加入右边界。

16620

C++STL容器总结

特点: (1) 关联式容器都是有序,升序排列,自动排序; (2) 实现是一个平衡二叉树,每个元素都有一个父节点和两个子节点, 左子树所有元素都比自己小,右子树所有元素都比自己大; 四、set/multiset...主要作用是将两个数据组成一个数据,用来表示一个二元组或一个元素对, 两个数据可以是同一个类型也可以是不同类型。...(1)将a作为左操作数,b作为右操作数,调用比较函数,并返回比较值 ; (2)将b作为左操作数,a作为右操作数,再调用一次比较函数,并返回比较值。...(1)自定义比较结构体; 首先,定义比较结构体 struct myComp { bool operator() (const 类型 &a, const 类型 &b)//重载“()”操作符...{ …… return(…); } }; 然后,定义set set s; 【第四届蓝桥杯预选赛】错误票据 题目描述

71010

数据结构_二叉树(C++

string类型,元素为char类型,因此值大于9整数(也就是两位以上整数)会被分成两个元素,无法正常表示和计算 //应先将表达式进行初始化:用元素类型为stringvector保存表达式操作数和操作字符...,用来存放根结点地址 Node *p, *left, *right; vector v = init(s);//先将string类型表达式初始化,将元素由char...= left; p->right = right; //在表达式树中,数字作为左结点是操作数,右结点是被操作数(表达式中左边数是操作数,右边数是被操作数 //表达式中数字从左到右正序入栈...,这个根结点就是表达式树根结点 root = s2.top(); } 总体思路: 表达式其实是一种递归,表达式是由 左操作数 操作符 右操作数 组成 操作数 是 表达式值 所以表达式 是由...一开始所有结点都没有父结点,当哈夫曼树建立完成之后,只有根结点是没有父亲,由此来判定哈夫曼树是否建成 由于每次循环创建一个新结点,原来权重最小两个结点有了父结点,没有父结点结点总数-2,但是新结点是没有父结点

37370

LeetCode刷题记录(easy难度21-40题)

平衡二叉树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它左右两个子树高度差绝对值不超过1,并且左右两个子树都是一棵平衡二叉树...平衡二叉树主要特点就是“棵空树或它左右两个子树高度差绝对值不超过1,并且左右两个子树都是一棵平衡二叉树”,知道了这个,题目又要求我们把一个已经排序数组(列表)作为整个二叉树值。...所以我们可以找出数组中中值,把他作为根,把小于中值作为左子树,大于中值作为右子树,在利用递归思想,从左子树中找到左子树根,在右子树中找到右子树根,就可以得到我们所需要平衡二叉树。...题意分析: 给定一个二叉树,判断其是否是平衡二叉树 思路分析 在上一题分析中,我们已经知道了什么叫做平衡二叉树。题目给出方法返回值bool类型,不利于我们去循环递归判断它。...我们可以单独写一个check函数,其返回值是int类型。当函数返回-1时,该二叉树为非平衡二叉树,当函数返回值不为-1时,该二叉树为平衡二叉树

1.4K10

数据结构初步(十一)- 二叉树oj来战

(2) 也就是说,把给出二叉树除主根节点外子树看做一颗新二叉树,把右子树看做另一颗新二叉树。...(3) 访问到元素需要存到一个数组中,这个数组需要由我们来动态开辟,最后返回该数组名(数组首元素地址)。数组大小也需要另外写一个函数计算,只需递归遍历一遍二叉树即可。...由于该参数特殊功能,需要横跨多个递归调用函数,所以其类型是指针类型,通过指针类型即可找到数组位置下标。...思路分析 (1) 在一颗二叉树root1中找另外一颗二叉树root2,可以看作是分别以root1中每个节点为根形成二叉树分别与root2相比较。...(2) 即转换为了两个二叉树是否相当问题。 (3) 采用分治思想,看成根和左右子树

34930

二叉树构建及其遍历算法

本篇博客参照了兰亭风雨博客:http://blog.csdn.net/ns_code/article/details/12977901/ 概要 二叉树是一种非常重要数据结构,很多其他数据机构都是基于二叉树基础演变过来...二叉树有先、中、后,层次四种遍历方式,因为树本身就是用递归定义,因此采用递归方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,若采用非递归方法实现先中后3种遍历,则要用栈来模拟实现(递归也是用栈实现...//如果当前节点没有左右孩子,或者有左孩子或有孩子,但已经被访问输出, //则直接输出该节点,将其出栈,将其设为上一个访问节点...: char data; BinaryTree* lchild; BinaryTree* rchild; public: //二叉树初始化函数...return height; } return 0; } }; int main() { cout<<"请初始化二叉树

42120

二叉树经典题题解(超全题目)(力扣)

层序遍历靠二叉树是不可以实现,所以需要一个队列+size来存储 */ /* 注意在C++中: 一维数组定义:vector 二维数组定义:vector vector...二叉树最大深度 https://leetcode.cn/problems/maximum-depth-of-binary-tree/ /*使用迭代法的话,使用层序遍历是最为合适,因为最大深度就是二叉树层数...翻转二叉树 https://leetcode.cn/problems/invert-binary-tree/ //每个节点左右都翻转一下就好 //该题可用前中后序,前序和后序是最好中序要绕弯子...对称二叉树 https://leetcode.cn/problems/symmetric-tree/ /*法一:递归法*/ /*两个关键点: 1.遍历顺序:后序,因为要把两个孩子信息传给父节点才知道左右父节点孩子一不一样...---->要把两个孩子信息传给父节点题目都是用后序遍历 2.解题关键:要知道看是否对称是看右子树是不是左子树翻转过来,左子树里侧 = 右子树里侧 左子树外侧 = 右子树外侧*/ class

15610

数据结构基础知识: 表 栈 队列 树 散列 堆

遍历顺序:左子树,节点,右子树。 2.4 二叉树binary tree) 在二叉树中,每个节点最多只有两个儿子。...二叉树平均深度为 O(\sqrt{N}) ,而对于特殊类型二叉树,如二叉查找树(binary search tree),其平均深度是 O(log N)...2.4.1 二叉树实现 因为一棵二叉树最多有两个儿子,所以我们可以用指针直接指向它们。树节点声明在结构上类似于双链表声明。...使二叉树成为二叉查找树性质是,对于树中每个节点 X ,它子树所有关键字值小于 X ,它右子树中所有关键字值大于 X 关键字值。...4.4.1 结构性质 堆是一棵被完全填满二叉树,有可能例外是在底层,底层上元素从左到右填入。这样树称为完全二叉树(complete binary tree)。

1.1K20

【愚公系列】2023年12月 五大常用算法(一)-分治算法

☀️1.2.1 操作数量优化 分治算法是一种将问题划分为多个子问题,并将子问题递归地解决,最终将子问题解合并成原问题解算法。在操作数量优化方面,分治算法可以提高算法效率。...分治算法在操作数量优化方面具有明显优势,可以提高算法效率,减少计算时间和资源开销。 ☀️1.2.2 并行计算优化 分治算法通常可以在并行计算中得到优化。...= " + index); } } 3.构建二叉树问题 分治算法可以用来构建二叉树,具体步骤如下: 找到子问题:将给定序列分成两个部分,分别构建二叉树。...合并子问题解:将子问题解合并成整个问题解。对于左右两个子问题,我们可以将左半部分序列中间节点作为根节点,右半部分序列中间节点作为其右孩子节点,然后递归地构建左子树和右子树。...返回结果:返回构建好二叉树

27722

STL关联容器-红黑树

此外SGI STL还提供了一个不再标准规格之列关联式容器:hash table(散列表),以及以此hash table为底层机制完成hash_set(散列集合),hash_map(散列映射表),hash_multiset...一般而言,关联式容器(map, multimap)内部结构是一个 balanced binary tree(平衡二叉树),以便获得良好搜寻效率,其中包括:AVL-tree(AVL树),RB-tree(...找二叉树节点前驱(比当前值小元素)和后继(比当前值大元素):如下图,节点25前驱是19,后继节点是29 ?...{ //【情况1】:存在右子树,则找出右子树最小节点 if (node->right !...= 0)//往右子树左边一直走到底 node = node->left;//最左节点就是后继结点 } //没有子树,但是RB-Tree中节点node

51130

二叉树问题(二)-LeetCode 965、563、993、958、919(树深度,层次遍历)

: 0 + 0 + 1 = 1 解题思路: 首先我们写出一个计算一个二叉树子树节点和递归式子,然后再递归参数中使用count来累加两个子树节点和差值,最后返回count即可。...注意使用引用传递不是值传递。 /** * Definition for a binary tree node....如果二叉树两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。 我们给出了具有唯一值二叉树根节点 root,以及树中两个不同节点值 x 和 y。...注意该二叉树值都是唯一没有重复。 /** * Definition for a binary tree node....设计一个用完全二叉树初始化数据结构 CBTInserter,它支持以下几种操作: CBTInserter(TreeNode root) 使用头结点为 root 给定树初始化该数据结构; CBTInserter.insert

34310

《王道》数据结构笔记整理2022级_数据结构笔记整理

后缀表达式计算—手算: 从左往右扫描,每遇到一个运算符,就让运算符前面最近两个操作数执行对应运算,合体为一个操作数; 注意: 两个操作数左右顺序 重点:后缀表达式计算—机算 用栈实现后缀表达式计算...,执行相应运算,运算结果压回栈顶,回到步骤1; 注意: 先出栈是“右操作数” 3.前缀表达式 (波兰表达式) 运算符在两个操作数前面: ① + a b ② - +ab c ③ - +ab *cd...3 步骤3: 若扫描到运算符,则弹出两个栈顶元素,执行相应运算,运算结果压回栈顶,回到步骤1; 注意: 先出栈是“左操作数” 4.中缀表达式计算(用栈实现) 两个算法结合: 中缀转后缀 + 后缀表达式求值...初始化两个栈,操作数栈 和运算符栈 若扫描到操作数,压人操作数栈 若扫描到运算符或界限符,则按照“中缀转后缀”相同逻辑压入运算符栈 (期间也会弹出运算符,每当弹出一个运算符时,就需要再弹出两个操作数栈项元素并执行相应运算...p父节点,且p是右孩子,且其左兄弟非空 —— p前驱为左兄弟子树中最后一个被先序遍历到结点(根节点出发,先往右,右没有往左,找到最下一层结点); case4: p没有父节点,即p为根节点,则

2.6K00

CC++常见面试知识点总结附面试真题—-20220326更新

在c中,int fun() 会解读为返回值为int(即使前面没有int,也是如此,但是在c++中如果没有返回类型将报错),输入类型和个数没有限制, int fun(void)则限制输入类型为一个void...C中是直接在变量或者表达式前面加上(小括号括起来)目标类型来进行转换,一招走天下,操作简单,但是由于太过直接,缺少检查,因此容易发生编译检查不到错误人工检查又及其难以发现情况;C++中引入了下面四种转换...红黑树是在AVL树基础上提出来。平衡二叉树又称为AVL树,是一种特殊二叉排序树。其左右子树都是平衡二叉树,且左右子树高度之差绝对值不超过1。...AVL树中所有结点为根左右子树高度之差绝对值不超过1。将二叉树上结点子树深度减去右子树深度值称为平衡因子BF,那么平衡二叉树所有结点平衡因子只可能是-1、0和1。...只要二叉树上有一个结点平衡因子绝对值大于1,则该二叉树就是不平衡。 map 为什么用红黑树,不是 AVL?

1.5K10
领券