LCA 类问题
来源:互联网 发布:2017淘宝如何提高销量 编辑:程序博客网 时间:2024/06/05 18:08
LCA 类问题
LCA 类问题是二叉树的高频问题之一;
有只给 root 的;
还有不给 root 给 parent pointer 的。
想面 FB,最好把各种二叉树问题的 recursion / iteration 还有 root / parent pointer 的写法都练熟才行,只 AC 是不够的。
下面这种向哪里走的问题,直接用尾递归解决。不要想遍历。
public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // Got to check if p and q is null as well; if(root == null) return root; if(root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q); if(root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q); return root; }}
因为是尾递归,显而易见的改法是用 while循环省去递归占用的系统栈空间;
public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { // Got to check if p and q is null as well; while(root != null){ if(root.val > p.val && root.val > q.val) root = root.left; else if(root.val < p.val && root.val < q.val) root = root.right; else return root; } return root; }}
Lowest Common Ancestor of a Binary Tree
时间复杂度 O(n),相对于每个 node 来讲,只会被函数调用和计算一次。
另一种时间复杂度的分析方式是,这题的递归结构是个 post-order traversal,遍历的复杂度当然是 O(n).
拿到树的题目,先想递归结构是什么,再想end condition.
想到这,迭代的写法也比较明显了,写个 post-order traversal 就行。
public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == null || root == q || root == p) return root; TreeNode left = lowestCommonAncestor(root.left, p, q); TreeNode right = lowestCommonAncestor(root.right, p, q); if(left != null && right != null) return root; else return (left == null) ? right : left; }}
想到这,另外一种思路就是使用HashMap + Set
0 0
- LCA 类问题
- LCA问题
- LCA问题
- LCA问题
- LCA问题
- LCA问题
- LCA 问题
- pku1330 LCA问题
- POJ 1330 LCA问题
- hnu 12029 LCA问题
- RQNOJ 28 LCA问题
- LCA问题 poj1330 / poj1470
- RMQ与LCA问题
- RMQ 和LCA问题
- LCA问题解法
- LCA与RMQ问题
- LCA 问题 Tarjan算法
- LCA问题----RMQ算法
- 第十四章 编程练习(2)
- 无向DFS遍历
- linux下配置wordpress
- 各种Binary Tree定义
- Eclispe 创建 Maven工程详解
- LCA 类问题
- 正交表测试用例设计
- Lab01 Editing text files on the command line
- 分布式系统的事务处理(转)
- The 7 stages of refactoring(转)
- 水平可见直线
- 学习简单自定义TitleBar
- 【Z10】引水入城
- 从10万条(int)数组中找到重复的数