树
Betternw
这个作者很懒,什么都没留下…
展开
-
判断t1树中是否有与t2树拓扑结构完全相同的子树
题目描述给定彼此独立的两棵二叉树,判断 t1 树是否有与 t2 树拓扑结构完全相同的子树。设 t1 树的边集为 E1,t2 树的边集为 E2,若 E2 等于 E1 ,则表示 t1 树和t2 树的拓扑结构完全相同。示例1输入:{1,2,3,4,5,6,7,#,8,9},{2,4,5,#,8,9}返回值:true代码 public boolean isContains (TreeNode root1, TreeNode root2) { // write code her原创 2021-08-08 15:21:14 · 421 阅读 · 0 评论 -
112 路径总和
题目描述给你二叉树的根节点 root 和一个表示目标和的整数 targetSum ,判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。叶子节点 是指没有子节点的节点。示例 1:输入:root = [5,4,8,11,null,13,4,7,2,null,null,null,1], targetSum = 22输出:true分析若当前节点就是叶子节点,那么直接判断 sum 是否等于 val 即可(因为路径和已经确定,就是当前节点的值,我们只需原创 2021-07-19 21:20:26 · 73 阅读 · 0 评论 -
958二叉树的完全性检验
题目描述给定一个二叉树,确定它是否是一个完全二叉树。百度百科中对完全二叉树的定义如下:若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)示例 1:输入:[1,2,3,4,5,6]输出:true解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。分析完全二叉树,层原创 2021-07-14 10:57:39 · 83 阅读 · 0 评论 -
【递归】110 平衡二叉树
题目判断一个二叉树是否为平衡二叉树分析平衡二叉树:左右子树高度差不大于1.因为一个树中,每个节点的子树都是平衡二叉树,那么整个树就是。使用递归。判断每个节点子树是否是:左子树是否是:右子树是否是?左右高度差是否小于1?是的话,返回高度。定义ReturnData类:每个类返回的值(是否是平衡二叉树,子树高度)。定义process方法:节点参数传入。如果节点为空,返回true。递归判断左子树是否是,右子树是否是,高度差是否小于1,满足的话返回(true,高度)递归方法相当于从叶节点开始判断,从叶节原创 2020-06-08 23:21:25 · 132 阅读 · 0 评论 -
【递归 卡特兰数】
思路G(n):表示长度为n的序列不同的二叉搜索树的个数 G(0)=1,G(1)=1F(i):表示以i为根的不同二叉搜索树个数。左子树节点个数为i-1个,右子树节点个数为n-i个。f(i)=G(i−1)∗G(n−i)因此,卡特兰数:G(n)=G(0)∗G(n−1)+G(1)∗(n−2)+…+G(n−1)∗G(0) / G(n)=∑G(i−1)⋅G(n−i)...原创 2020-06-18 23:01:53 · 897 阅读 · 0 评论 -
[dfs bfs] 199 二叉树的右视图
题目给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]1 <—/ 2 3 <—\ 5 4 <—思路dfs,按照根、右、左的顺序遍历,可以保证每层第一个访问的是最右边的节点。用深度做比较,结果集中存放的元素个数,和深度是对应的。当遍历到新的一层时,如果depth==结果集大小,说明原创 2020-07-01 19:42:06 · 144 阅读 · 0 评论 -
【dfs回溯】 113 路径总和
题目给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。给定如下二叉树,以及目标和 sum = 22,5/ 4 8/ / 11 13 4/ \ / 7 2 5 1返回:[[5,4,11,2],[5,8,4,5]]思路dfs回溯。必须是结尾为叶子节点时才加入列表。剪枝是:当左孩子为空就遍历右,右为空就遍历左。因为如果不剪枝,当遍历到叶子节点的时候,会遍历一次左孩子遍历一次右孩子,就会有两个重复解。代码publi原创 2020-07-02 09:43:10 · 118 阅读 · 0 评论 -
【dfs】 108将有序数组转换成二叉搜索树
题目将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。思路二叉搜索树中序遍历就是升序数组。又因为是平衡树,所以以中间元素作为根节点代码 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }} public TreeNode so原创 2020-07-03 16:56:04 · 75 阅读 · 0 评论 -
【公式 G(n) = G(i-1)G(n-i)】 96不同的二叉搜索树
题目给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?示例:输入: 3输出: 5解释:给定 n = 3, 一共有 5 种不同结构的二叉搜索树:1 3 3 2 1\ / / / \ 3 2 1 1 3 2/ / \ 2 1 2 3思路当i原创 2020-07-20 17:13:07 · 123 阅读 · 0 评论 -
【递归 两个递归】 437 路径总和
题目给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 810/ 5 -3/ \ 3 2 11/ \ 3 -2 1返回 3。和等于 8 的路径有:5 -> 35 -> 2 -> 1-3 -> 11思路原创 2020-06-10 16:43:55 · 156 阅读 · 0 评论 -
【递归】 145 二叉树的后序遍历
题目给定一个二叉树返回他的后序遍历思路非递归用两个栈实现。第一个栈是前序的思路,放入根右左,(代码顺序是根左右),第二个栈实现逆序的功能代码递归:public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res = new ArrayList<>(); helper(root,res); return res;}public void helper(T原创 2020-07-01 15:16:54 · 81 阅读 · 0 评论 -
【递归】 144 二叉树的前序遍历
题目给定一个二叉树返回他的前序遍历输入: [1,null,2,3]12/3输出: [1,2,3]思路前序和中序遍历只需要改变一下记录根节点的顺序。代码递归: public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }} public List<Integer> preorderTraversal(Tree原创 2020-07-01 14:45:33 · 84 阅读 · 0 评论 -
【动态规划 左右数组 0不偷1偷】 337 打家劫舍
思路后序遍历:需要先知道叶子节点的信息,才能决定父节点。原创 2020-07-03 19:38:58 · 3288 阅读 · 0 评论 -
【递归??】 offer33 二叉搜索树的后序遍历序列
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。5/ 2 6/ 1 3输入: [1,6,3,2,5]输出: false输入: [1,3,2,6,5]输出: true分析最后一个是根节点,找到左子树和右子树,然后递归判断。当只有一个节点的时候,符合要求,找左子树的时候左边区域一定都是小于根节点的,判断右子树,当寻找右子树指针和根节点重合说明不符合要求。代码public b原创 2020-07-08 00:23:30 · 116 阅读 · 0 评论 -
【中序遍历】 offer 54 二叉搜索树的第K大节点
题目给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:输入: root = [3,1,4,null,2], k = 13/ 1 42输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 35/ 3 6/ 2 4/1输出: 4思路二叉搜索树和中序遍历有关系,中序遍历二叉搜索树的逆序就是递增序列。因此采用递归,进行中序遍历的逆序。并且传入计数变量和结果变量,每经过一个节点数量减1,当k=0的时候,将当前节点值原创 2020-07-11 11:21:19 · 119 阅读 · 0 评论 -
【双端队列】 offer32-3 从上到下打印二叉树
题目请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[20,9],[15,7]]思路建立双端队列。用res的值来判断为偶数的时候,就插入到list的尾部为奇数的时候,就插入到list的头部代码public List<List<Inte原创 2020-07-07 22:39:27 · 99 阅读 · 0 评论 -
【队列】 offer32-1 从上到下打印二叉树
题目从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。给定二叉树: [3,9,20,null,null,15,7],3/ 9 20/ 15 7返回:[3,9,20,15,7]思路队列,层次遍历输出。空节点不输出,需要判空代码public int[] levelOrder(TreeNode root) { if(root==null) return new int[0]; Queue<TreeNode> queue = new Li原创 2020-07-07 21:55:43 · 119 阅读 · 0 评论 -
【dfs 中序】 offer36 二叉搜索树与双向链表
题目将一个二叉搜索树转换成循环双向链表思路二叉搜索树按中序遍历出就是升序序列,再标注一个前驱节点就可以进行链表的连接。代码Node pre,head;public Node treeToDoublyList(Node root) { if(root==null) return null; dfs(root); //得到头尾结点,将头尾连接 head.left = pre; pre.right = head; return head;}publ原创 2020-07-02 11:10:51 · 72 阅读 · 0 评论 -
【递归 先序】 offer26 树的子结构
题目输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。思路相当于先序遍历,采用fun方法判断以当前节点为根节点是否相同。fun相当于可以帮助判断从哪个节点开始判断。如果不相同,递归判断A的左子树和A的右子树,代码public boolean isSubStructure(TreeNode A, TreeNode B) { if(A==null||B==null) return false; /原创 2020-07-06 22:42:29 · 98 阅读 · 0 评论 -
【递归】 617合并二叉树
题目给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。思路return是为了判断特殊情况然后中止程序。递归判断该节点的左右应取什么值。这个递归是从上往下的,且...原创 2020-06-12 10:58:33 · 98 阅读 · 0 评论 -
【递归】543 二叉树的直径
题目给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。1/ 2 3/ \4 5返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。分析最长路径,不一定是路过根节点的。是任意两个节点之间的。因此要记录以每个节点为根节点的直径情况:左子树高度加右子树高度。这其中最大的数字才是最长路径。每一次递归的返回值,返回的是当前深度加一。这样就是上一层节点的深度。最后一层递归实际求出来的就是最原创 2020-06-15 00:19:47 · 191 阅读 · 0 评论 -
【递归】 538把二叉搜索树转换为累加树
题目给定一个二叉搜索树(Binary Search Tree),把它转换成为累加树(Greater Tree),使得每个节点的值是原来的节点值加上所有大于它的节点值之和。输入: 原始二叉搜索树:5/ 2 13输出: 转换为累加树:18/ 20 13思路二叉搜索树,要想到中序遍历。写出最后的结果集合,每个数字的值就是后者所有的累加。因此就是反向中序遍历,并把每次的节点值进行累加。代码public class TreeNode { int val;原创 2020-06-12 16:00:33 · 137 阅读 · 0 评论 -
【递归 递归左右,比较存在】 236 二叉树的最近公共祖先
题目给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1 的最近公共祖先是节点 3。思路当左右都是空,则左右子树都没有qp,返回null如果左右都不为空,pq在异侧,...原创 2020-06-26 18:51:05 · 109 阅读 · 0 评论 -
【递归 自底向上 交换当前的左右,递归交换左交换右】 226 翻转二叉树
题目翻转一颗二叉树输入:4/ 2 7/ \ / 1 3 6 9输出:4/ 7 2/ \ / 9 6 3 1分析交换每个节点的左右节点,递归向上。注意:直接交换操作就行。不用考虑其他值。(被链表的next啥的给扰乱思路,其实直接交换值就可以。)代码 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(原创 2020-06-10 12:03:36 · 123 阅读 · 0 评论 -
【208】 实现前缀树
题目实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。trie.insert(“apple”);trie.search(“apple”); // 返回 truetrie.search(“app”); // 返回 falsetrie.startsWith(“app”); // 返回 truetrie.insert(“app”);trie.search(“app”); // 返回 true思路给定一个字符串,路径是否原创 2020-06-13 10:11:52 · 162 阅读 · 0 评论 -
【递归 左、右、当前、返回子树】 124 二叉树的最大路径和
题目给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。题目链接思路递归,算出以当前节点为根节点的最大路径之和,返回的当前层的最大子树加上自身值。递归步骤:当前计算方式,递归公式,返回上一层的值。负数不参与路径计算。代码 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode原创 2020-06-23 19:24:17 · 205 阅读 · 0 评论 -
【递归 分治】 114 二叉树展开为链表
题目给定一个二叉树,原地将它展开为单链表思路遍历每个节点,用暂时节点保存右子树,将左子树连接到根的右边,然后找到最右的节点,把右子树连接上。递归。图解代码 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left,原创 2020-06-23 18:28:07 · 119 阅读 · 0 评论 -
【递归 哈希表 根据根节点位置划分左右】 105从前序和中序遍历序列构造二叉树
题目根据一棵树的前序遍历与中序遍历构造二叉树。前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]3/ 9 20/ 15 7思路【根 左子树 右子树】【左子树 根 右子树】只要中序遍历定位到根节点,就知道左右子树的节点数目,然后递归继续求左右子树的根节点。中序遍历的定位可以用哈希表快速实现。代码 public class TreeNode { int val; TreeNode left;原创 2020-06-23 17:57:01 · 197 阅读 · 0 评论 -
【BFS 队列】104 二叉树的最大深度
题目给定一个二叉树,找出其最大深度分析递归;非递归:使用队列,BFS思想。每次for循环放入一层,深度++。代码public static class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int data) { this.val = data; }}private static int maxDe原创 2020-06-09 16:09:05 · 139 阅读 · 0 评论 -
【bfs 队列】 102 二叉树的层序遍历
题目给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。二叉树:[3,9,20,null,null,15,7],3/ 9 20/ 15 7返回其层次遍历结果:[[3],[9,20],[15,7]]分析dfs和bfs的原理使用对比dfs:递归加栈bfs:队列。应用:层序遍历,最短路径在输出的时候,同一层的节点要放在一个数组中。那么就在每一层开始遍历之前,先记录队列中的数量n,一口气将这n个节点都弹出并将这n个节点的左右孩子都加原创 2020-06-18 23:48:09 · 157 阅读 · 0 评论 -
【递归 辅助函数,判断两个节点的值是否相等】 101对称二叉树
题目给定一个二叉树 检查是否是镜像对称的分析镜像的二叉树:结点1的左子树和结点2的右子树值相等。如果都为空:是镜像的如果一空一不空:不是镜像的如果值不相等:不是镜像的使用递归,递归函数写在第一个函数中,传入的参数的节点的左右孩子。递归函数:左右孩子进行上述判断,如果都符合,那么递归向上判断。这里有个小技巧:因为是判断比较两个节点的左右子树值,因为最后return的是两个函数的与结果。每一层递归与的结果都为true时候,最外层递归结果才为true。public static class原创 2020-06-09 14:32:11 · 304 阅读 · 0 评论 -
【中序遍历 min的设置】 98 验证二叉搜索树
题目验证一个二叉树是否是二叉搜索树分析如果是二叉搜索树,那么中序遍历的结果就是升序。因此在非递归中序遍历的情况下,增加前后值的大小判断。代码public static class TreeNode { public int val; public TreeNode left; public TreeNode right; public TreeNode(int data) { this.val = data; }}public sta原创 2020-06-09 00:42:23 · 103 阅读 · 0 评论 -
【迭代:helper 不空迭左,加入集合,不空迭右】【非迭代:一直到最左,弹出入集,看右是否在】94 二叉树的中序遍历
题目给定一个二叉树,返回他的中序遍历分析递归:中序左——打印——中序右非递归:空右不空左。设置一个栈,先将头结点压入栈中。head为移动指针。如果当前节点不为空,则将左边全部压入栈。如果当前节点为空,则弹出并打印,找到打印节点的右边,判断是否为空。代码//迭代public void preOrderRecur1(Node head){ if(head==null){ return; } preOrderRecur1(head.left); Sy原创 2020-06-08 16:53:50 · 129 阅读 · 0 评论