Leetcode: Binary Tree Longest Consecutive Sequence
2015-12-29 01:11
746 查看
Given a binary tree, find the length of the longest consecutive sequence path. The path refers to any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The longest consecutive path need to be from parent to child (cannot be the reverse). For example, 1 \ 3 / \ 2 4 \ 5 Longest consecutive sequence path is 3-4-5, so return 3. 2 \ 3 / 2 / 1 Longest consecutive sequence path is 2-3,not3-2-1, so return 2.
递归法
复杂度
时间O(n) 空间O(h)思路
因为要找最长的连续路径,我们在遍历树的时候需要两个信息,一是目前连起来的路径(curLen)有多长(以当前节点为终点),二是目前路径的上一个节点的值(preVal)。每一次递归,先检查当前节点是否比上一节点大1, 是,curLen++, 否curLen置1 (curLen = (cur.val==preVal+1)? curLen+1 : 1)
返回时,返回如下三个中的大者:
1. curLen: 以当前节点为结束节点的最大路径
2. root.left递归返回值: 以左子树以下某节点为终点的最大路径
3. root.right递归返回值: 以右子树以下某节点为终点的最大路径
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public int longestConsecutive(TreeNode root) { if (root == null) return 0; return helper(root, 0, Integer.MAX_VALUE); } public int helper(TreeNode cur, int curLen, int preVal) { curLen = (cur.val == preVal+1)? curLen+1 : 1; int left=0, right=0; if (cur.left != null) left = helper(cur.left, curLen, cur.val); if (cur.right != null) right = helper(cur.right, curLen, cur.val); return Math.max(curLen, Math.max(left, right)); } }
其实我自己的方法更好:在递归里不需要保存上一个节点值,在当前节点cur就把cur.left和cur.right的curLen算出来;也不需要return type,把结果res存成一个 Instance variable,在recursion里面找寻最大的curLen, 一旦找到就记录下来,记录在instance variable res里面。最后返回res。以下提供arraylist存res和直接res是一个instance variable的做法
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { ArrayList<Integer> res = new ArrayList<Integer>(); public int longestConsecutive(TreeNode root) { if (root == null) return 0; res.add(0); helper(root, 1); return res.get(0); } public void helper(TreeNode root, int curLen) { if (curLen > res.get(0)) res.set(0, curLen); if (root.left != null) { int left = (root.left.val==root.val+1)? curLen+1 : 1; helper(root.left, left); } if (root.right != null) { int right = (root.right.val==root.val+1)? curLen+1 : 1; helper(root.right, right); } } }
public class Solution { int res = 0; public int longestConsecutive(TreeNode root) { if (root == null) return 0; helper(root, 1); return res; } public void helper(TreeNode root, int curLen) { if (curLen > res) res = curLen; if (root.left != null) { int left = (root.left.val==root.val+1)? curLen+1 : 1; helper(root.left, left); } if (root.right != null) { int right = (root.right.val==root.val+1)? curLen+1 : 1; helper(root.right, right); } } }
上面这段code13行和17行得用一个variable去存,直接在14行和18行里面算在大case里面会有stackoverflow的错误
相关文章推荐
- Android进程和UI线程小结及注意事项
- iOS uilabel自动换行
- iso uinavigationcontrollerdemo2
- spoj 375 QTREE - Query on a tree 树链剖分
- UIimageView和UIimage的小区别
- 含文本框的提示框的使用->UIAlertController类的使用(用户登录界面实例)
- UTF8转NSString+UIControl响应事件
- UIGraphicsBeginImageContext 获取图片、截图
- iOS UITableView(四) 为tableView设置头尾视图,改变cell的宽度,cell的缩进
- MUI 顶部选项卡-可左右拖动(div)
- 【iOS系列】-UITableViewCell的展开与收缩的实现思路
- UITextField限制输入的字符个数。比如输入手机号时,只能是11位
- UICollectionView基础
- Quickstart containers
- JS_对各类型数据的操作方式_ByValue/ByReference
- GitHub从fork到pull request之基础流程
- iOS UI-九宫格
- _int、NSInteger、NSUInteger、NSNumber的区别和联系
- 根据Request获取客户端IP
- leetcode 232: Implement Queue using Stacks