随笔分类 - 

摘要:这题的难点在于怎么判断查询到的2个节点没有同一个父节点,因此我们每次遍历的 时候,就记录下当前节点的左右子节点,然后对下一层做判断,这样每一层遍历的时候 就能得出下一层的结果 时间O(n),空间O(n) 1 public boolean isCousins(TreeNode root, int x, 阅读全文
posted @ 2021-05-14 11:08 jchen104 阅读(56) 评论(0) 推荐(0)
摘要:方案一、使用BFS遍历每个元素,遍历时不停检测是否存在2个元素和相加满足要求 时间O(n),空间O(n) 1 public boolean findTarget(TreeNode root, int k) { 2 if(root==null) return false; 3 Set<Integer> 阅读全文
posted @ 2021-05-12 10:14 jchen104 阅读(77) 评论(0) 推荐(0)
摘要:方案一、 使用BFS或者DFS遍历每个元素,可直接获得结果 1 public int closestValue(TreeNode root, double target) { 2 int tag=root.val; 3 double res= Math.abs(root.val-target); 4 阅读全文
posted @ 2021-05-08 11:03 jchen104 阅读(180) 评论(0) 推荐(0)
摘要:使用DFS求解 时间O(n),空间O(h)(h为整棵树的深度) 1 class Solution { 2 int res=0; 3 public int diameterOfBinaryTree(TreeNode root) { 4 def(root); 5 return res; 6 } 7 8 阅读全文
posted @ 2021-05-05 17:07 jchen104 阅读(35) 评论(0) 推荐(0)
摘要:BFS解,时间O(n^2),空间O(n^2) 1 public List<String> binaryTreePaths(TreeNode root) { 2 List<String> paths = new ArrayList<String>(); 3 if(root==null) return 阅读全文
posted @ 2021-04-28 14:35 jchen104 阅读(52) 评论(0) 推荐(0)
摘要:广度优先遍历,依次访问2颗树的每一个节点并经行比较 时间O(n),空间O(n) public boolean isSameTree(TreeNode p, TreeNode q) { Deque<TreeNode> queue1 = new LinkedList<TreeNode>(); Deque 阅读全文
posted @ 2021-04-16 17:44 jchen104 阅读(39) 评论(0) 推荐(0)
摘要:题目要求判断一棵树是否包含另一棵树,广度优先遍历由于需要维护一个队列, 这个队列会依次把每一层的节点全部压入队列,在本题中本层的其他节点会造成干扰项, 所以我们使用深度优先 方法一:深度优先遍历暴力破解 class Solution { public boolean isSubtree(TreeNo 阅读全文
posted @ 2021-04-14 10:29 jchen104 阅读(48) 评论(0) 推荐(0)
摘要:使用广度优先 使用2个队列,一个纪录树的节点,一个纪录节点对应的值 时间O(n)(每个节点都被访问一遍),空间O(n)(叶子节点最多为平衡二叉树情况下n/2) public boolean hasPathSum(TreeNode root, int targetSum) { if (root==nu 阅读全文
posted @ 2021-04-12 15:21 jchen104 阅读(54) 评论(0) 推荐(0)
摘要:二叉树的建立方式是不唯一的,因此这里我们不同的方法建立的二叉树也是不一致的 这里我用的方法是二分法取中间元素建立当前叶子节点 时间O(n)(每个元素都需要遍历一遍),空间O(logn)(本次建立的二叉树要保持平衡,所以树的高度固定为logn) class Solution { public Tree 阅读全文
posted @ 2021-04-10 14:48 jchen104 阅读(55) 评论(0) 推荐(0)
摘要:1. 使用DFS解法 递归计算每颗字数的最大深度 时间O(n)(每个节点都要被遍历一次),空间O(h)(与递归深度有关,递归深度又与二叉树高度相关) public int maxDepth(TreeNode root) { if (root==null) return 0; int left = m 阅读全文
posted @ 2021-04-09 14:44 jchen104 阅读(75) 评论(0) 推荐(0)
摘要:暂时没有想到非递归的方法,这里用递归来处理了 根据题目的定义,我们可以通过计算每一棵子树的左右高度差, 只要有一个子树不平衡,则整体不平衡(这里有个优化小细节,我们以-1为标记位,当出现-1则整棵树 不平衡,不需要再做后续判断) 时间O(n),空间O(n) private int def(TreeN 阅读全文
posted @ 2021-04-08 14:30 jchen104 阅读(49) 评论(0) 推荐(0)
摘要:老规矩,使用队列辅助完成广度优先遍历操作。 从根节点开始将左右孩子压入队列。 然后不停的从队列出去首2位元素(left,right)进行比较, 如相等,再将left节点的left节点与right节点的right节点。 这里有点绕人,需要结合图片理解 在比较完根节点的2个子孩子2和2后,根据镜像的性质 阅读全文
posted @ 2021-04-08 11:39 jchen104 阅读(52) 评论(0) 推荐(0)
摘要:翻转二叉树,2种方案,递归与非递归 (个人更喜欢非递归的方案,大多数情况下非递归的迭代都拥有更低的时空间复杂度,当然也存在 傅里叶快速变换那种小而美的递归方案,见仁见智吧) 1. 递归(深度优先遍历方案) 此方案中,我们会直接从最顶层父节点,一路递归至最左侧叶子节点, 然后再递归至其父节点的右孩子, 阅读全文
posted @ 2021-04-06 18:28 jchen104 阅读(240) 评论(0) 推荐(0)
摘要:首先复习下二叉搜索树BST的概念,总结一下就是 1.若任意结点的左子树不空,则左子树上所有结点的值均不大于它的根结点的值。2. 若任意结点的右子树不空,则右子树上所有结点的值均不小于它的根结点的值。3.任意结点的左、右子树也分别为二叉搜索树 参考了下大佬的解答, 如果两个节点值都小于根节点,说明他们 阅读全文
posted @ 2021-04-06 16:55 jchen104 阅读(55) 评论(0) 推荐(0)