![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树
傅里叶不想变换_
这个作者很懒,什么都没留下…
展开
-
树专题总结
树专题二叉搜索树第k小的结点树的高度二叉树中值为某一和的路径层次遍历Z字形打印二叉树(层次遍历)验证二叉搜索树的后序遍历序列平衡树树的子结构重建二叉树二叉搜索树第k小的结点思路:二叉搜索树中序遍历(有递归写法和非递归写法)是递增的。注意边界条件,比如 k <= 0 || k > 树的结点个数import java.util.ArrayList;public class Solution { ArrayList<TreeNode> res = new ArrayList原创 2021-03-18 22:31:26 · 247 阅读 · 0 评论 -
96. 不同的二叉搜索树
思路:二叉搜索树中序遍历是递增的,现在题目给出的序列就是自增的。我们可以遍历每个数字 i,将该数字作为树根,将 1 ~ (i−1) 序列作为左子树,将 (i+1) ~ n 序列作为右子树。接着我们可以按照同样的方式递归构建左子树和右子树。class Solution { public int numTrees(int n) { if(n <= 2) return n; int[] dp = new int[n +1]; dp[0] = 1;.原创 2021-08-09 16:52:00 · 70 阅读 · 0 评论 -
617. 合并二叉树
思路:深度优先,从根节点开始同时遍历两个二叉树,并将对应的节点进行合并。三种情况: 1.如果两个二叉树的对应节点都为空,则合并后的二叉树的对应节点也为空; 2.如果两个二叉树的对应节点只有一个为空,则合并后的二叉树的对应节点为其中的非空节点; 3.如果两个二叉树的对应节点都不为空,则合并后的二叉树的对应节点的值为两个二叉树的对应节点的值之和,此时需要显性合并两个节点。对一个节点进行合并之后,还要对该节点的左右子树分别进行合并。这是一个递归的过程class Solution { .原创 2021-07-15 10:32:37 · 143 阅读 · 0 评论 -
124. 二叉树中的最大路径和
思路:递归计算左右子节点的最大贡献值。class Solution { int maxSum = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { maxGain(root); return maxSum; } public int maxGain(TreeNode node) { if (node == null) { retu..原创 2021-07-08 10:12:34 · 49 阅读 · 0 评论 -
226. 翻转二叉树/剑指 Offer 27. 二叉树的镜像
思路一:递归特判:如果root为空,返回空把root的左子树放到mirrorTree中镜像一下把root的右子树放到mirrorTree中镜像一下交换左右子树返回根节点rootclass Solution { public TreeNode invertTree(TreeNode root) { if (root == null) { return null; } TreeNode left = invertTr原创 2021-07-05 16:37:07 · 76 阅读 · 0 评论 -
树的遍历总结
A1090 Highest Price in Supply Chain计算一棵树最深的叶子结点的个数。思路:1、维持一个最大深度max_depth,初始化为一个很小的数字(正常情况不会达到),初始化最大深度叶子结点个数num=0。2、递归边界:当前结点index没有孩子,说明已经到达叶子结点。vector<int> Node[maxn];int num = 0, max_d...原创 2020-04-19 16:02:34 · 173 阅读 · 0 评论 -
1004 Counting Leaves(求每一层有多少叶子结点) (30分)
A family hierarchy is usually presented by a pedigree tree. Your job is to count those family members who have no child.Input Specification:Each input file contains one test case. Each case starts w...原创 2020-04-19 14:48:04 · 134 阅读 · 0 评论 -
重建二叉树(三种顺序)
这里写目录标题226. 翻转二叉树105. 从前序与中序遍历序列构造二叉树106. 从中序与后序遍历序列构造二叉树889. 根据前序和后序遍历构造二叉树226. 翻转二叉树class Solution { public TreeNode invertTree(TreeNode root) { if(root == null) return null; invertTree(root.left); invertTree(root.right);原创 2021-04-22 22:19:17 · 68 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列
思路:递归,后序遍历的最后一个一定是树的根节点,且左子树元素都比根节点元素小,右子树元素都比根节点元素大,这样就可以把数组分成两部分。如,[1,3,2,6,5],5(根节点) 可以将数组分为 左子树[1,3,2] 和右子树 [6] 两个部分在[1,3,2]中,2又可以将数组分为 [1] 和 [3] 两部分class Solution { public boolean verifyPostorder(int[] postorder) { return recur(postord.原创 2021-03-12 15:33:41 · 61 阅读 · 0 评论 -
Leetcode 98. 验证二叉搜索树
思路:1.直接根据定义来,左子树 这里写目录标题利用定义利用中序遍历递归写法非递归写法利用定义// 输入为[2147483647]时,超出了Integer的范围,所以用Longclass Solution { public boolean isValidBST(TreeNode root) { return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } public boolean isValidBS.原创 2021-03-11 21:00:28 · 60 阅读 · 0 评论 -
Leetcode.110 平衡二叉树
思路:求树的高度,然后左右子树高度差<=1且左右子树都是平衡二叉树class Solution { public boolean isBalanced(TreeNode root) { if(root == null){ return true; }else{ return Math.abs(depth(root.left) - depth(root.right)) <= 1 && is.原创 2021-03-11 15:53:42 · 64 阅读 · 0 评论 -
N叉树的遍历总结
层次遍历:跟二叉树不同的是,二叉树出队后将其左右孩子加入队列,而 N 叉树出队后将其所有孩子加入队列N叉树的遍历层次遍历前序遍历三级目录层次遍历所有孩子加入队列的代码for(int j = 0; j < node.children.size(); j++){ queue.offer(node.children.get(j));}for(Node kid : node.children){ queue.offer(kid);}class Solution {原创 2021-03-11 14:21:49 · 417 阅读 · 1 评论 -
Leetcode.103 二叉树的锯齿形层序遍历
思路:层次遍历,加一个标志位,从右至左的时候,将数组逆序再加入结果集即可。层次遍历框架: Queue<TreeNode> queue = new LinkedList<>(); if(root == null) return res; queue.offer(root); while(!queue.isEmpty()){ List<Integer> temp = new ArrayList<>(); int size = .原创 2021-03-11 13:43:54 · 58 阅读 · 0 评论 -
二叉树遍历模板(递归和非递归版本)
栈的推荐写法:Deque<TreeNode> stack = new ArrayDeque<>();队列的推荐写法:Queue<TreeNode> queue = new LinkedList<>();为了不改变根节点:TreeNode cur = root;非递归版本的框架:需要一个栈 s 来树中的结点,一个 list 来存储结果集。// 一个栈和一个listList<Integer> res = new ArrayList<&g原创 2021-03-09 10:36:18 · 256 阅读 · 2 评论 -
剑指 Offer 07. 重建二叉树
思路:在前序序列中,根结点是第一个元素。在中序序列中找到它就可以将左右子树区分开。然后就可以重建二叉树分析:左子树的结点个数numLeft = k - inL左子树中序序列[inL, k - 1],后序序列 [postL, postL + numLeft - 1]。右子树中序序列[k + 1, inR],后序序列 [postL + numLeft, postR - 1]。后记:类似还有已知道中序序列和先序序列,思路很相似。仍然是左子树的结点个数numLeft = k - inL左子树中序序列.原创 2021-01-28 21:51:14 · 77 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先
思路1:分别记录根节点到p和q的路径,两条路径中最后一个相同的节点就是共同祖先思路2:若 root 是 p,q 的 最近公共祖先 ,则只可能为以下情况之一: 1.p 和 q 在 root 的子树中,且分列 root 的 异侧(即分别在左、右子树中) 2.p=root,且 q 在 root 的左或右子树中 3.q=root,且 p 在 root 的左或右子树中public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, Tre.原创 2021-01-28 11:00:11 · 75 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树
思路:从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树。class Solution { public boolean isSymmetric(TreeNode root) { if (root == null) return true; return helper(root.left, root.right); } boolean helper(TreeNode L, TreeNode R){ // 如果左右同.原创 2021-01-27 19:43:57 · 64 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树
思路:写一个函数treeDepth来返回树的高度class Solution { public boolean isBalanced(TreeNode root) { if (root == null) return true; int leftTreeDepth = treeDepth(root.left); int rightTreeDepth = treeDepth(root.right); if (Math.abs(ri.原创 2021-01-27 15:50:24 · 111 阅读 · 2 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点
思路:二叉搜索树的中序遍历是递增序列,将中序遍历的结果保存下来,返回中序遍历的倒数第k个元素即可。二叉搜索树第 k 大的节点可转化为求 此树的中序遍历的倒数第 k 个节点class Solution { public int kthLargest(TreeNode root, int k) { List<Integer> res = new ArrayList<>(); inorder(root, res); //.原创 2021-01-27 12:31:55 · 115 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径
思路: 深度优先+回溯dfs(root, sum)函数: 终止条件:结点root为空,直接返回 递推工作: 1.加入当前结点的值root.val,并且更新sum-=root.val 2.如果当前结点为叶子结点且路径和==sum,则将此路径path加入resclass Solution { List<List<Integer>> res = new LinkedList<>(); LinkedList<Integer> pa.原创 2021-01-22 10:33:42 · 70 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表
思路:二叉树的中序遍历是递增的,因此会想到中序遍历。class Solution { Node pre, head; public Node treeToDoublyList(Node root) { if(root == null) return null; inorder(root); head.left = pre; pre.right = head; return head; } ..原创 2021-01-21 14:38:56 · 72 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构
class Solution { public static boolean isSubStructure(TreeNode A, TreeNode B) { if (A == null || B == null) return false; //先从根节点判断B是不是A的子结构,如果不是在分别从左右两个子树判断, //B不光有可能是A的子结构,也有可能是A左子树的子结构或者右子树的子结构,只要有一个成立就返回true ..原创 2021-01-10 20:48:37 · 106 阅读 · 2 评论