tree
文章平均质量分 76
bsbcarter
这个作者很懒,什么都没留下…
展开
-
*LeetCode-Symmetric Tree
今天怎么状态这么不好,感觉这个题不简单啊,居然是easy。 看了答案才写出来。两种,recursive代码很简单,只是想清楚不容易,感觉怎么写helper要想明白。 iterative 写了好久,总是出错,用stack实现,每次push一对对应位置上的node,即应该相等的node。push进去之前就判断这对的值是否相等,pop出来之后,对于这一对,要检查一下前提条件(是否都具有左右子,对应原创 2015-03-04 07:33:28 · 344 阅读 · 0 评论 -
*LeetCode-Binary Tree Paths
由于一些corner case比如就一个节点 比如一边没有节点了 root自己就不能算作是一个path 用 root + -> 比 -> root 要方便一些 public class Solution { public List binaryTreePaths(TreeNode root) { List list = new ArrayList ();原创 2015-09-28 00:59:37 · 254 阅读 · 0 评论 -
**LeetCode-Lowest Common Ancestor of a Binary Tree
假如访问到一点 等于其中某一个node 那就返回这个node 都不等于就分别访问左右子树 左右两边假如返回的都不是null 那么lca就是root 假如一个是null 那lca就是另一个 其实还没想清楚 public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, Tr原创 2015-09-28 23:54:54 · 263 阅读 · 0 评论 -
*LeetCode-Closest Binary Search Tree Value
啊 最直观的应该是iterative的 每次向下一层 都尝试更新min dist就好 不会因为选择了某一边而错过min dist的!因为假如root 比target大 那root右边那些更大的不可能比root更近! public class Solution { public int closestValue(TreeNode root, double target) {原创 2015-10-17 06:34:16 · 255 阅读 · 0 评论 -
**LeetCode-Count Complete Tree Nodes
简直不会做( 递归看root的高度h和 左右子的高度 假如右子高度是h-1 说明最后一个节点在右子中 这样的话root + left大小是 2 ^ h 根据等比数列求和算出来的 再加上递归右子的count(right) 假如右子高度不是h-1说明最后一个node在左子中, 就是root + right 大小 这时候righ是完整的 总共 2 ^ h-1 也是等比求和 再递归左子 注意 p原创 2015-10-01 03:02:24 · 261 阅读 · 0 评论 -
LeetCode-Lowest Common Ancestor of a Binary Search Tree
这个题是BST 有数值关系所以简单 假如root是两个node其中之一 , 或者两个node分布在root两边, root就是lca else root向下至应该去的一边 public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {原创 2015-09-14 23:35:39 · 251 阅读 · 0 评论 -
LeetCode-Binary Tree Upside Down
right child is leaf or null 保证了可以flip 就是说right node不可能再有child node 每个node变成自己left child的 right node 自己的right child变成left child的left child 递归 记得要先把左边先做一遍再移动root层的指针 同时root的left right point 要set null原创 2015-10-21 08:12:22 · 356 阅读 · 0 评论 -
*LeetCode-Path Sum II
和以前做的backtracking很像 但是注意要删除这次add的node!!否则左边recurse加上了left 到了右边却没有remove left就继续了 public class Solution { public List> pathSum(TreeNode root, int sum) { List> res = new ArrayList> ();原创 2015-10-06 03:21:41 · 242 阅读 · 0 评论 -
*LeetCode-Populating Next Right Pointers in Each Node II
和第一题不一样的是不一定是complete tree 直接按level order traversal就好 就是用que 每次弄一行 add下一行 /** * Definition for binary tree with next pointer. * public class TreeLinkNode { * int val; * TreeLinkNode left原创 2015-10-07 03:52:51 · 251 阅读 · 0 评论 -
*LeetCode-Verify Preorder Sequence in Binary Search Tree
build bst using traversal那些题还要再看一遍 用一个stack 每次假如还在left subtree 即num 《 stack top 就push 假如大了 就一直pop知道不再大于 然后push进去 但是要记录pop出来的最后一个数字 就是已经遍历过的左子root 不能再有小于他的了 所以记录在一个int里面 每次数字都要和这个纪录比较 假如出现比他小的 就fals原创 2015-10-22 02:53:08 · 632 阅读 · 0 评论 -
*LeetCode-Count Univalue Subtrees
想到了用递归判断子树中的count 并且记录目前位置所有数字是否unify 但是没有想好怎么存这些信息 怎么返回,count 可以作为static var 然后helper就返回boolean 注意count更新的条件 返回true false的条件很难归置好 注意判断left right 是否为null 返回false的条件就是首先 left right递归后都要是ture 同时left不是原创 2015-10-22 03:55:18 · 619 阅读 · 0 评论 -
**LeetCode-Inorder Successor in BST
简直想不清楚!!! iterative: TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) { TreeNode* candidate = NULL; while (root) root = (root->val > p->val) ? (candidate = root)->left : root原创 2015-10-22 08:23:07 · 274 阅读 · 0 评论 -
*LeetCode-Recover Binary Search Tree
找到需要swap的两个node 就是inorder traversal 然后发现两个不是增序的点 每个和他的前一个数比 第一个不对的点是 a > b就是a 第二个数是a 记录一个prev 一个first一个sec 最后两个node的swap不需要挪动指针 只要改node的值就好了 public class Solution { public TreeNode prev = new原创 2015-10-08 05:02:29 · 273 阅读 · 0 评论 -
*LeetCode-Convert Sorted List to Binary Search Tree
inorder就是顺序的一个linked list 每次找到list的中间 就是root 左边sub list中间就是左子 右边sub list的中间就是右子 但是注意只有一个node的情况 要把head设置成null 而且每次找到mid之后 要把mid之前的那个node.next = null public class Solution { public TreeNode sor原创 2015-09-28 23:03:01 · 269 阅读 · 0 评论 -
*LeetCode-Binary Tree Maximum Path Sum
写一个helper计算从这个点向下能到达的最大sum 然后每次更新全局最大sum 记得每次left 和 right 是要和0比较 因为可以不向下走 最下也是0 public class Solution { int max = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { maxDown ( r原创 2015-10-09 23:49:38 · 229 阅读 · 0 评论 -
LeetCode-Invert Binary Tree
tree一般就用recursion 还需要继续练习 需要注意的是recursion总是和循环写混乱,并不需要loop了 最开始我把if写成了while public class Solution { public TreeNode invertTree(TreeNode root) { if ( root == null ) return nu原创 2015-09-14 23:18:36 · 370 阅读 · 0 评论 -
*LeetCode-Binary Tree Right Side View
应该看出来和level order traversal 一样 第一种方法就是基于这个的 每次展开一层 从最右边开始展开 然后将这一层的第一个放入 即最右边一个 用一个queue维护 public class Solution { public List rightSideView(TreeNode root) { Queue que = new LinkedList原创 2015-09-27 10:10:44 · 239 阅读 · 0 评论 -
*LeetCode-Kth Smallest Element in a BST
一个函数来数这个root下一共多少node 非常简单 recursive 然后就是主函数中判断left有多少node的时候需要数右边 想清楚 +1 -1的事情 因为要算上root本身 public class Solution { public int kthSmallest(TreeNode root, int k) { if ( countNode ( root.l原创 2015-09-27 07:53:41 · 234 阅读 · 0 评论 -
*LeetCode-Unique Binary Search Trees II
比第一个题要求高 不但要给出个数 是要给出所有可能的树 每次确定一个root 然后 (1,root -1)就是左子树 (root+1,n)就是右子树 注意边界条件 start > end的时候要返回一个list 里面是一个null node 而不能是一个null list 因为这种情况是这个树没有左子或者右子 然后就指向null public class Solution { pu原创 2015-09-25 04:47:57 · 152 阅读 · 0 评论 -
LeetCode-Same Tree
和上一题几乎一模一样,只是不用左右交替了,更简单,把上个symmetric的helper function稍微改一下就是这个题了 public class Solution { public boolean isSameTree(TreeNode p, TreeNode q) { if ( p == null || q == null ){ ret原创 2015-03-04 07:48:18 · 234 阅读 · 0 评论 -
LeetCode-Binary Tree Level Order Traversal II
唯一和上一个题不同的就是要倒序输出层,从底层开始。只需要改一个小地方就是最后将每层list add到大list时候,用add(0,list),即add到第一位。 public class Solution { public List> levelOrderBottom(TreeNode root) { Queue que = new LinkedList();原创 2015-03-07 23:08:32 · 299 阅读 · 0 评论 -
*LeetCode-Valid BST
错误解法:以为遍历的时候每次查看是否left 递归解法就需要每次传入两个界,min max,是根据当前的parent已经parent的情况确定的。要注意test case就是MAX_VALUE MIN_VALUE, 因为定义中是严格大于小于 所以在判断非法树的时候 写的是root.val >= max || root.val 所以要用root.val > max || root.val原创 2015-03-08 03:11:45 · 347 阅读 · 0 评论 -
LeetCode-Minimum Depth of Binary Tree
DFS 里面的if else写错了 第一段是正确代码,第二段是错误的。错误的写法就是因为多写了一个else,就不会再进right那边了。 public class Solution { public int minDepth(TreeNode root) { if ( root == null ) return 0; int min原创 2015-02-26 03:10:22 · 294 阅读 · 0 评论 -
LeetCode-Binary Tree Zigzag Level Order Traversal
这个请参照level order traversal 不同的就是需要看每次从左还是右输出,维持一个bool 每一层取反就行,然后根据这个bool判断是用add(e) 还是add(0,e) public class Solution { public List> zigzagLevelOrder(TreeNode root) { Queue que = new Linked原创 2015-03-08 01:03:30 · 238 阅读 · 0 评论 -
*LeetCode-Balanced Binary Tree
感觉一写递归就全是错。 首先练熟递归,然后搞清楚dfs bfs与各种traversal关系,再写树 这个题首先一开始递归写的有问题,既然每次已进入helper函数,首先判断了node是否为空,就不要再继续先判断是否有左右子再递归了,直接递归就行。正确的: public int countD ( TreeNode node){ if ( node == null)原创 2015-03-04 01:24:40 · 310 阅读 · 0 评论 -
*LeetCode-Binary Tree Level Order Traversal
首先不知道java中bfs用什么数据结构,知道用queue之后,不知道queue怎么实现。 java中一般使用 Queue queueA = new LinkedList(); Queue queueB = new PriorityQueue(); 来实现queue,常用linkedlist来实现没有优先级的,即单纯的fifo. 记得看queue的讲解,里面有两套function,分别原创 2015-03-07 22:49:51 · 265 阅读 · 0 评论 -
LeetCode-Path Sum
典型dfs,但是dfs写的太少了== base case想了很久,main函数里面怎么处理第一次调用也想了很久。把判断条件搞错了好几次。应该在每次走到这个节点时就判断左右子是否为空。 /** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; *原创 2015-02-26 01:22:04 · 309 阅读 · 0 评论 -
*LeetCode-Binary Search Tree Iterator
设计数据结构,用一个内部的stack存所有小于root的节点,即push的顺序是从大到小的,实现一个pushall函数 就是push这个node一直往左走路径上的所有节点。 public class BSTIterator { private Stack stack = new Stack(); public BSTIterator(TreeNode root) {原创 2015-03-08 08:01:46 · 335 阅读 · 0 评论 -
LeetCode-Maximum Depth of Binary Tree
递归方法非常简单 只要判断左右depth 取max+1就行 public class Solution { public int maxDepth(TreeNode root) { if ( root == null ) return 0; int left = maxDepth(root.left); int ri原创 2015-03-08 07:23:57 · 346 阅读 · 0 评论 -
LeetCode-Binary Tree Inorder Traversal
和前序几乎一模一样,递归里面就是add的时间在进入左右子之间 非递归的就是把add那句话放进了else中,即当前node为null,pop stack返回上一层时加入这个node 递归: public class Solution { public List inorderTraversal(TreeNode root) { List list = new Array原创 2015-03-08 00:24:35 · 250 阅读 · 0 评论 -
*LeetCode-Flatten Binary Tree to Linked List
感觉这个题像前序遍历,但是其实完全按preorder的话 我只能想到用两个stack 太不好了 看到用stack的iterative 发现入stack顺序和preorder不一样,才能保证出来的时候是这个顺序 即先push right 再push left,pop之后的右子设置为当前stack top 这个里面强调不要忘记将左子设置为null; public void flatten原创 2015-03-08 01:59:11 · 365 阅读 · 0 评论 -
*LeetCode- Sum Root to Leaf Numbers
这个题一开始一直想从叶子开始加,后来发现从root向下走比较方便。递归函数传一个记录到达当前节点的和。 recursive: public class Solution { public int sumNumbers(TreeNode root) { return sum(root,0); } public int sum (TreeNode root,原创 2015-03-08 08:32:42 · 303 阅读 · 0 评论 -
*LeetCode-Binary Tree Preorder Traversal
preorder,inorder, postorder都属于dfs “第一种是以图的深度优先搜索为原型的遍历, 可以是中序, 先序和后序三种方式, 不过结点遍历的方式是相同的, 只是访问的时间点不同而已, 对应于Binary Tree Inorder Traversal, Binary Tree Preorder Traversal和Binary Tree Postorder Tra原创 2015-03-08 00:11:34 · 376 阅读 · 0 评论 -
*LeetCode-Binary Tree Postorder Traversal
code ganker说这个的非递归很难,看了半天觉得好麻烦,看到discussion里面有个特别天才的解法!! preorder 是root-left-right, postorder是 left-right-root。那么稍微改一下preorder 变成 root-right-left 那个么就和postorder顺序完全相反了!!只要Collections.reverse就行!! 代码:原创 2015-03-08 00:47:52 · 286 阅读 · 0 评论 -
*LeetCode-Convert Sorted Array to Binary Search Tree
直观的就是recursive方法 每次取中间的数字做root 左右分别做 一开始用的方法用本函数递归了 就不能传index 只能传subarray 就废了空间因为要copy 后来看了一眼去年写的 应该写一个传本array和start end的helper函数来递归 public class Solution { public TreeNode sortedArrayToBST(int原创 2015-11-01 04:15:49 · 228 阅读 · 0 评论