力扣刷题之二叉树
二叉树
迪恩_Emma
喜欢看书的Java开发
展开
-
145. 二叉树的后序遍历(简单)
思路:递归迭代(中等、难)代码:class Solution { public List<Integer> postorderTraversal(TreeNode root) { Deque<TreeNode> stack=new LinkedList<>(); LinkedList<Integer> res=new LinkedList<>(); if(root==null){ return re.原创 2021-06-22 16:41:36 · 172 阅读 · 0 评论 -
144. 二叉树的前序遍历(简单)
思路:1.递归2.迭代代码:递归:class Solution { List<Integer> list=new ArrayList<>(); public List<Integer> preorderTraversal(TreeNode root) { if(root==null){ return new ArrayList<>(); } list.add(root.val); p.原创 2021-06-21 10:58:32 · 84 阅读 · 0 评论 -
617. 合并二叉树(简单)
思路:深度优先遍历分别遍历两个二叉树的左节点,右节点,分别相加代码:class Solution { public TreeNode mergeTrees(TreeNode root1, TreeNode root2) { if(root1==null){ return root2; } if(root2==null){ return root1; } TreeNode merge=new TreeNode(root1.val+root2.原创 2021-06-16 09:23:02 · 115 阅读 · 0 评论 -
543. 二叉树的直径(简单)
思路:后序遍历,只是直径指的是边,而不是节点的个数代码:class Solution { int max=0; public int diameterOfBinaryTree(TreeNode root) { depth(root); return max; } private int depth(TreeNode root){ if(root==null){ return 0; } int left=depth(root.left.原创 2021-06-15 09:51:19 · 127 阅读 · 0 评论 -
337. 打家劫舍 III(中等)
思路:动态规划dp,后序遍历(消除后效性)代码:class Solution { public int rob(TreeNode root) { //注意dfs返回的参数是int[],2个值(根节点偷/不偷),还要比较哪一种比较大 int[] res=dfs(root); return Math.max(res[0],res[1]); } private int[] dfs(TreeNode root){ if(root==null){ ret.原创 2021-06-12 11:02:21 · 59 阅读 · 0 评论 -
226. 翻转二叉树(简单)
思路:后序遍历(递归)代码:class Solution { public TreeNode invertTree(TreeNode root) { if(root==null){ return null; } //后序遍历 TreeNode left=invertTree(root.left); TreeNode right=invertTree(root.right); root.left=right; root.right=left; .原创 2021-06-09 09:36:32 · 49 阅读 · 0 评论 -
124. 二叉树中的最大路径和(困难)
思路:动态规划,深度优先遍历代码:public class Solution { private int res; public int maxPathSum(TreeNode root) { res=Integer.MIN_VALUE; dfs(root); return res; } private int dfs(TreeNode root){ if(root==null){ return 0; } int left=Ma.原创 2021-06-04 10:14:42 · 74 阅读 · 0 评论 -
114. 二叉树展开为链表(中等)
思路:前序遍历得到一个数组,再原地修改root代码:class Solution { public void flatten(TreeNode root) { List<TreeNode> list = new ArrayList<TreeNode>(); preorderTraversal(root, list); int size = list.size(); for (int i = 1.原创 2021-06-03 09:49:40 · 97 阅读 · 0 评论 -
105. 从前序与中序遍历序列构造二叉树(中等)
思路:哈希+深度优先遍历代码:class Solution { int[] preorder; Map<Integer,Integer> map=new HashMap<>(); public TreeNode buildTree(int[] preorder, int[] inorder) { this.preorder=preorder; for(int i=0;i<inorder.length;i++){ map.put(in.原创 2021-06-03 09:31:36 · 99 阅读 · 0 评论 -
104. 二叉树的最大深度(简单)
思路:深度优先遍历代码:class Solution { public int maxDepth(TreeNode root) { if(root==null){ return 0; } return Math.max(maxDepth(root.left),maxDepth(root.right))+1; }}分解:1)核心代码:比较左右子树中较大的一个,再+1return Math.max(maxDepth(root.lef..原创 2021-06-03 09:15:30 · 192 阅读 · 0 评论 -
102. 二叉树的层序遍历(中等)
思路:广度优先遍历代码:class Solution { List<List<Integer>> res=new ArrayList<>(); public List<List<Integer>> levelOrder(TreeNode root) { if(root==null){ return res; } bfs(root); return res;.原创 2021-06-02 10:52:03 · 67 阅读 · 0 评论 -
101. 对称二叉树(简单)
思路:递归代码:class Solution { public boolean isSymmetric(TreeNode root) { //二叉树的问题要么用递归,要么用中序遍历 return dfs(root,root); } private boolean dfs(TreeNode t1,TreeNode t2){ if(t1==null&&t2==null){ return true; } if(t1==null||.原创 2021-06-02 10:01:30 · 98 阅读 · 0 评论 -
98. 验证二叉搜索树(中等)
思路:利用递归,剪枝条件是当前root的val不小于左边且不大于右边代码:class Solution { public boolean isValidBST(TreeNode root) { return isValidBST(root,Long.MIN_VALUE,Long.MAX_VALUE); } private boolean isValidBST(TreeNode node,long low,long high){ if(node==null){.原创 2021-06-02 09:52:16 · 80 阅读 · 0 评论 -
94. 二叉树的中序遍历(简单)
思路:典型的二叉树中序遍历代码:class Solution { List<Integer> path=new ArrayList<>(); public List<Integer> inorderTraversal(TreeNode root) { if(root==null){ return path; } if(root.left!=null){ inorderTraversal(root.left); .原创 2021-06-01 11:47:52 · 132 阅读 · 0 评论 -
剑指 Offer 68 - II. 二叉树的最近公共祖先(简单)
思路:注意本题是求二叉树的,而不是二叉搜索树的,区别是:二叉搜索树不需要判断null返回,而二叉树需要代码:class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root==null||p==root||q==root){ return root; } TreeNode left=lowestCommonAncesto.原创 2021-05-18 10:12:28 · 119 阅读 · 0 评论 -
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先(简单)
思路:方法一:迭代(自顶向下)方法二:递归(自底向上)代码:迭代:class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { while(root!=null){ //全在左边 if(p.val<root.val&&q.val<root.val){ root=root.left; } .原创 2021-05-18 09:57:25 · 68 阅读 · 0 评论 -
剑指 Offer 55 - II. 平衡二叉树(简单)
思路:利用递归,先序遍历/后序遍历代码:先序遍历:class Solution { public boolean isBalanced(TreeNode root) { //先序遍历,自顶向下 if(root==null) return true; return Math.abs(Depth(root.left)-Depth(root.right))<2&& isBalanced(root.left)&&isBalanc.原创 2021-05-11 09:51:46 · 124 阅读 · 0 评论 -
剑指 Offer 55 - I. 二叉树的深度(简单)
思路:深度优先遍历 / 广度优先遍历代码:dfs:class Solution { public int maxDepth(TreeNode root) { if(root==null) return 0; int left=maxDepth(root.left); int right=maxDepth(root.right); return Math.max(left+1,right+1); }}bfs:class S.原创 2021-05-10 09:50:35 · 63 阅读 · 0 评论 -
剑指 Offer 54. 二叉搜索树的第k大节点(简单)
思路:二叉搜索树的中序遍历是递增的!(左、根、右)可以利用这个特性,进行中序遍历逆序的遍历(右、根、左)代码:class Solution { int res=-1,k; public int kthLargest(TreeNode root, int k) { this.k=k; dfs(root); return res; } private void dfs( TreeNode root ){ if(root==null){ ret.原创 2021-05-10 09:14:47 · 90 阅读 · 0 评论 -
剑指 Offer 37. 序列化二叉树(困难)
思路:序列化:相当于一个层序遍历,使用广度优先遍历,与别的题目的区别是:如果该节点不是null,并且如果该节点的左、右节点中有null,也要把该节点算上反序列化:判断的条件有点不同,在不是null的情况下才把节点接在根节点下,并且加入队列中代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * ..原创 2021-05-02 22:38:36 · 68 阅读 · 0 评论 -
剑指 Offer 36. 二叉搜索树与双向链表(中等)
思路:对二叉树进行中序遍历,也就是左、根、右的顺序,最后返回head即可// 打印中序遍历void dfs(Node root) { if(root == null) return; dfs(root.left); // 左 System.out.println(root.val); // 根 dfs(root.right); // 右}代码:/*// Definition for a Node.class Node { publ.原创 2021-05-01 11:28:46 · 70 阅读 · 0 评论 -
剑指 Offer 34. 二叉树中和为某一值的路径(中等)
思路:典型的深度优先遍历(回溯算法)代码:class Solution { public List<List<Integer>> pathSum(TreeNode root, int target) { List<List<Integer>> res=new ArrayList<>(); List<Integer> path=new ArrayList<Integer>();.原创 2021-04-30 11:38:39 · 73 阅读 · 0 评论 -
剑指 Offer 33. 二叉搜索树的后序遍历序列(中等)
思路:此题只是判断数组是否符合条件,只需要判断数组即可,不用返回数组方法一:深度优先搜索(递归)方法二:单调栈代码:方法一:class Solution { public boolean verifyPostorder(int[] postorder) { return dfs(postorder,0,postorder.length-1); } private boolean dfs( int[] postorder, int.原创 2021-04-30 10:40:00 · 103 阅读 · 0 评论 -
剑指 Offer 32 - III. 从上到下打印二叉树 III(中等)
思路:层序遍历(BFS)+奇偶层逻辑判断代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public List<List<Inte.原创 2021-04-29 09:49:03 · 68 阅读 · 0 评论 -
剑指 Offer 32 - II. 从上到下打印二叉树 II(简单)
思路:广度优先遍历代码:class Solution { public List<List<Integer>> levelOrder(TreeNode root) { List<List<Integer>> res=new ArrayList<>(); //是Queue不是List Queue<TreeNode> queue=new LinkedList<>(); if(root!.原创 2021-04-28 10:03:05 · 183 阅读 · 0 评论 -
剑指 Offer 32 - I. 从上到下打印二叉树(中等)
思路:广度优先遍历代码:class Solution { public int[] levelOrder(TreeNode root) { if(root==null){ //创建空数组的格式为new int[0] return new int[0]; } Queue<TreeNode> queue=new LinkedList<>(); queue.add(root).原创 2021-04-27 11:09:43 · 142 阅读 · 0 评论 -
剑指 Offer 28. 对称的二叉树(简单)
思路:递归,与26题类似代码:class Solution { public boolean isSymmetric(TreeNode root) { if(root==null){ return true; } return recur(root.left,root.right); } private boolean recur(TreeNode a,TreeNode b){ if(a==null&&b==null){ .原创 2021-04-26 09:26:52 · 95 阅读 · 0 评论 -
剑指 Offer 27. 二叉树的镜像(简单)
思路:方法一:递归方法二:辅助栈代码:方法一:class Solution { public TreeNode mirrorTree(TreeNode root) { if(root==null){ return null; } TreeNode left=mirrorTree(root.left); TreeNode right=mirrorTree(root.right); root.left.原创 2021-04-25 11:22:06 · 91 阅读 · 0 评论 -
剑指 Offer 26. 树的子结构(中等)
思路:先序遍历+递归代码:/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public boolean isSubStructure(TreeNod.原创 2021-04-25 10:47:27 · 82 阅读 · 0 评论