本文涉及知识点 二叉树的遍历 栈的运用 二叉树的遍历和栈的相关概念前面已经介绍,忘记了的小伙伴复习后再看效果一定翻倍哟! 二叉树知识复习:[今天给二叉树加个BGM,二叉树唱歌了!] 队列知识复习:[leetcode栈队列]1 栈实现队列 1 Leetcode226 翻转二叉树 翻转一棵二叉树。。 先看看示例中二叉树 ? ? 从根节点访问,先将根节点4放入栈中。 ? 从栈中取出4(注意是指针哟),引入临时变量temp实现指针之间交换。与此同时记录两节点,分别入栈。 ? ?
对称二叉树 - 力扣(LeetCode) /* 解题思路: 判断一个树是否对称,首先要判断左右孩子是否对称相等,还需要判断左孩子的左子树是否和右孩子的右子树对称,左孩子的右子树是否和右孩子的左子树对称。
规定二叉树的根节点为第 0 层,如果当前层数是偶数,从左至右输出当前层的节点值,否则,从右至左输出当前层的节点值。 ; } } ret.add(level); } return ret; } } 5. 规定二叉树的根节点为第 0 层,如果当前层数是偶数,从左至右输出当前层的节点值,否则,从右至左输出当前层的节点值。
1.2 两种特殊的二叉树 1. 满二叉树: 一颗二叉树, 如果每层的结点数都达到最大值, 则这颗二叉树就是满二叉树. 若满二叉树的层数为K, 那么其节点总数是 2^k - 1. 2. 完全二叉树: 完全二叉树是效率很高的数据结构, 完全二叉树是由满二叉树 引出来的。 具有 n 个结点的完全二叉树的深度 k 为 log2(n+1) 上取整 5. 前序遍历结果: 1 2 3 4 5 6 中序遍历结果: 3 2 1 5 4 6 后序遍历结果: 3 1 5 6 4 1 以上图二叉树为例, 代码实现前中后序递归遍历. leftTree+1 : rightTree+1); } // 5.
1.1 单值二叉树 题目描述: 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回true;否则返回 false。 做题链接: 965. 对称二叉树 解题思路: 看上面这个二叉树,如果我们将它分为,根节点,左子树,右子树。如果将左子树和右子树拆分开,那么判断对称二叉树,便可转化为检查两颗树是否相同!! 平衡二叉树 题目描述: 给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。 下列关于二叉树的叙述错误的是( A) A.二叉树指的是深度为 2 的树 B.一个 n 个结点的二叉树将拥有 n-1 条边 C.一颗深度为 h 的满二叉树拥有 2^h-1 个结点(根结点深度为1) 根据二叉树性质,完全二叉树的高低为 h = log(n+1)向上取整。
【题目】 按照二叉树的后序遍历打印二叉树,并且不能使用递归。 【难度】 易 解答 没看过前序遍历和中序遍历的或许可以先看下: 【二叉树打卡3】二叉树的先序遍历(非递归版) 【二叉树打卡4】二叉树的中序遍历(非递归版) 二叉树的后序遍历顺序是左-右-根。 我们可以采用一个栈来辅助,不过它和前序遍历以及中序遍历还是有点区别的,我们把后序遍历的结果放到一个 LinkedList 容器中作为返回值,具体步骤如下: 1、把二叉树的根节点 root 放进栈。
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。 示例: 输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释: 1 <--- / \ 2 3 <--- \ \ 5 4 <--- 解题思路: 1,这个题目是层序遍历的变形:层序遍历不需要每一层断开,本题需要每一层断开,取每一层最右元素(左视图类似) 2,这里需要两个队列: A,第一个队列存上一层结果 : 输入: 2 / \ 1 3 输出: 1 示例 2: 输入: 1 / \ 2 3 / / \ 4 5 示例: 输入: 1 / \ 3 2 / \ \ 5 3 9 输出: [1, 3, 9] 解题思路
重建二叉树 剑指offer 07:重建二叉树 ? 题目描述 解决思路 这道题要求我们根据中序遍历和前序遍历构建一颗二叉树。
1.在二叉树的第i层上最多有2 i-1 个节点 。 推导过程根据性质 2: 假设深度为k 的满二叉树的节点个数一定为2k-1,那么n=2k-1推得满二叉树的度数为k=log2(n+1); 完全二叉树是具有n个节点的二叉树,若按层序编号那么其编号与同样深度的满二叉树的节点编号在二叉树的位置相同 ,那么他就是完全二叉树,也就是说他的叶子几点只可能出现在最下边的两层,他的深度等于满二叉的深度,但他的节点一定少于等于满二叉树的节点个数,但一定多与2k-1-1,2k-1-1第度数为k-1层的满二叉树的节点个数 则根据第二条性质得 2k-1 -1<n ≤ 2k -1,即2k-1≤ n < 2k 即 k-1 ≤ log2 n < k 因为 k 只能是整数,因此, k =[log2n] + 1 5. 若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意一个编号为 i 的结点: (1) 若 i=1,则该结点是二叉树的根,无双亲, 否则,编号为 [i/2] 的结点为其双亲结点
每道题会提供简单的思路以及测试通过的代码 题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。 (ps:我们约定空树不是任意一个树的子结构) 二叉树结构: 1 class TreeNode { 2 int val; 3 TreeNode left; 4 TreeNode right ; 5 TreeNode(int x) { val = x; } 6 } 注:点击左下角的阅读原文即可跳转到原文,可以提交代码 解答思路 对于与二叉树有关的题目,90% 是采取递归的方式来解决比较简单的 root1,TreeNode root2) { 3 if (root2 == null || root1 == null) { 4 return false; 5
二叉树简介 基本结构: function TreeNode(x) { this.val = x; this.left = null; this.right = null; } 二叉树的前序 题目1 二叉树的镜像 1.1 题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ 11 9 7 5 1.2 解题思路 递归交换二叉树两棵字树的位置。
一、题目:重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示的二叉树并输出它的头结点。 ? ; } } 该方法首先接收参数,依次打印先序遍历和中序遍历,最后通过调用Construct方法获得重建的二叉树的根节点,并实例化一个二叉树的数据结构(本处的二叉树结构的实现请阅读 《数据结构基础温故-4.树与二叉树(上)》),最后输出重建后的二叉树的层次遍历验证是否重建成功。 (1)普通二叉树 // 普通二叉树 // 1 // / \ // 2 3
大家好,又见面了,我是全栈君 一 题目:重建二叉树 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示的二叉树并输出它的头结点。 三 代码实现 (1)索引实现 struct TreeNode { int data; TreeNode* pLeft; TreeNode* pRight; }; // 重构二叉树 return StructNode(pre, pre + len -1, mid, mid+len-1); } void main() { int pre[] = {1,2,4,7,3,5,6,8 }; int mid[] = {4,7,2,1,5,3,8,6}; TreeNode* p =RebulidTree_2(pre, mid, 8); return; } 发布者
(二)广度优先遍历(Breadth-First-Search=>BFS) 1, 层级遍历(level order traversal) 我们来看一个普通二叉树: 这里简单说下为什么拿二叉树举例,这是因为在实际开发中 <T> right; } 上面的代码是一个基于泛型的二叉树模型表示,代表二叉树的一个节点,里面有一个data字段,用来保存该节点的数据,此外还有左孩子节点和右孩子节点,分别表示二叉树的两个分支 在上图的栈里,我们发现栈顶部分仍然是一颗子树,所以我需要继续拆分,按照先左,再根,最后右来拆分,继续入栈,最后图示如下: 这时候,整棵树都拆分成了叶子节点,我们直接出栈每一个节点,就完成了中序的遍历: 5 myPostOder(root.right);//全部遍历完右子树 System.out.print(root.data+" ");//根节点 } 输出的结果分别是: 1 12 5 6 9(前序) 5 12 6 1 9(中序)5 6 12 9 1(后序) 从上面的能够看到,递归的代码非常简洁,但是如果不明白原理只会看的一头雾水。
序列化二叉树的一种方法是使用前序遍历。当我们遇到一个非空节点时,我们可以记录下这个节点的值。如果它是一个空节点,我们可以使用一个标记值记录,例如 #。 _9_ / \ 3 2 / \ / \ 4 1 # 6 / \ / \ / \ # # # # # # 例如,上面的二叉树可以被序列化为字符串 "9,3,4 给定一串以逗号分隔的序列,验证它是否是正确的二叉树的前序序列化。编写一个在不重构树的条件下的可行算法。 每个以逗号分隔的字符或为一个整数或为一个表示 null 指针的 '#' 。 9,3,4,#,#,1,#,#,2,#,6,#,#" 输出: true 示例 2: 输入: "1,#" 输出: false 示例 3: 输入: "9,#,#,1" 输出: false 解题思路 1,前序遍历二叉树的时候 ,如果两个孩子是空节点,可以把父节点替换成空节点,依次进行下去,如果最终只剩下根节点是空,则二叉树合法 2,上述过程可以借助栈来实现 3,注意,由于数据可能不是个位数,所以需要用strings.Split
3.叶子结点或终端结点:度为0的结点称为叶结点; 如上图:B、C、H、I…等节点为叶结点 4.双亲结点或父结点:若一个结点含有子结点,则这个结点称为其子结点的父结点; 如上图:A是B的父结点 5. 也就是说,如果一棵二叉树的层数为K,且结点总数是,则它就是满二叉树。 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。 return 0; } return sizeNode2(root.left)+sizeNode2(root.right)+1; } 5. 获取叶子节点的个数 //5. 5.最终栈留下来的就是我们要找的节点的路径了。返回true。
前言博主最近在刷leetcode,做到二叉树套题的时候发现很多题的解题思路都是基于二叉树的层序遍历来完成的,因此写下这篇文章,记录一下二叉树层序遍历这件"神器"在实战的运用。 leetcode 102.二叉树的层序遍历图片二叉树的层序遍历与传统的前序、中序、后序遍历都有一些区别,他是按层级、从左到右、从上到下进行遍历的,因此当我在遍历当前层节点的时候,肯定需要记录当前层所有节点的 你真的会发现,理解了层序遍历后,解决这些关联题,会如鱼得水一般简单102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的前序遍历515.在每个树行中找最大值 116.填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点指针II104.二叉树的最大深度111.二叉树的最小深度leetcode 107.二叉树的层序遍历II图片此题与102.二叉树的层序遍历极其相似 二叉树的最小深度图片此题与104.
(空二叉树),或由一个根节点和两颗互不相交的、分别称为根节点的左子树和右子树的二叉树组成; 这样看来,二叉树可以使用递归来创建。 特点: 每个节点最多有两个子节点; 二叉树中最大的度为2; 无论有几个分支,都需要区分是左子树还是右子树; 二、分类及实现 2.1 分类 斜二叉树:只有左子节点或只有右子节点的二叉树称为斜二叉树; ? 满二叉树特点: 叶子结点只能; 非叶子节点的结点的度为2; 完全二叉树:对一棵具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点位置完全相同; ? 完全二叉树特点: 叶子结点只能出现在最下两层; 最下层的叶子结点一定集中在左边并且连续; 若结点度为1,则该节点只有左子节点; 注:满二叉树一定是完全二叉树,而完全二叉树不一定是满二叉树; 线索二叉树 2.2 普通二叉树 2.2.1 二叉树的遍历分类 二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有节点,使得每个 节点被访问依次且仅被访问一次。
满二叉树: 除最后一层无任何子节点外,每一层上的所有结点都有两个子结点 完全二叉树: 完全二叉树是由满二叉树而引出来的。 对于深度为K的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 如下图 满二叉树都是完全二叉树 完全二叉树依次填满直至满二叉树的阶段,每一个树都是完全二叉树 二叉搜索树 它是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点: 若其左子树存在,则其左子树中每个节点的值都不大于该节点值 平衡二叉树定义(AVL): 它或者是一颗空树,或者具有以下性质的二叉排序树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。 详情点击参考链接https://www.jianshu.com/p/1bbb19156454 红黑树和平衡二叉树的区别 1.红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下
题目描述 给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。 示例1 输入:{2,1,3} 返回值:true,true 基本概念 搜索二叉树(Binary Search Tree - BST) 它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空 完全二叉树(Complete Binary Tree- CBT) 若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边。 经典应用:堆 完全二叉树由满二叉树转化而来,也就是将满二叉树从最后一个节点开始删除,一个一个从后往前删除,剩下的就是完全二叉树。 实现代码 # 思路:利用递归进行中序遍历,通过判断中序遍历序列是否有序来判定是否为搜索二叉树 def isBSTmidTravelsal(self,root): res = [] def