最近公共祖先,lintcode
2016-12-07 00:14
369 查看
给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。
最近公共祖先是两个节点的公共的祖先节点且具有最大深度。
注意事项
假设给出的两个节点都在树中存在
解题思路:采用分治的思想,递归的在左右子树中查找,如果跟节点不为空或者要查找的节点,继续递归查找。
一刷ac
换一种dfs的方法,保存到达两个节点的路径,然后找到公公前缀最后一个位置就是公共祖先。
还可以考虑用map+queue
最近公共祖先是两个节点的公共的祖先节点且具有最大深度。
注意事项
假设给出的两个节点都在树中存在
解题思路:采用分治的思想,递归的在左右子树中查找,如果跟节点不为空或者要查找的节点,继续递归查找。
一刷ac
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */ public class Solution { /** * @param root: The root of the binary search tree. * @param A and B: two nodes in a Binary. * @return: Return the least common ancestor(LCA) of the two nodes. */ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode A, TreeNode B) { if (root == null || root == A || root == B) return root; TreeNode findInLeft = lowestCommonAncestor(root.left, A, B); TreeNode findInRight = lowestCommonAncestor(root.right, A, B); if(findInLeft == null) return findInRight; if(findInRight == null) return findInLeft; return root; } }
换一种dfs的方法,保存到达两个节点的路径,然后找到公公前缀最后一个位置就是公共祖先。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { List<TreeNode> l1 = new ArrayList<TreeNode>(); List<TreeNode> l2 = new ArrayList<TreeNode>(); dfs(root, p, l1); dfs(root, q, l2); int i = 1; TreeNode res = root; while(i < l1.size() && i < l2.size()){ if(l1.get(i) == l2.get(i)){ res = l1.get(i); }else{ break; } i++; } return res; } public boolean dfs(TreeNode root, TreeNode node, List<TreeNode> l){ if(root == null) return false; if(node == root){ l.add(root); return true; } l.add(root); if(dfs(root.left, node, l)){ return true; } if(dfs(root.right, node, l)){ return true; } l.remove(l.size()-1); return false; } }
还可以考虑用map+queue
相关文章推荐
- [Lintcode]Lowest Common Ancestor 最近公共祖先
- lintcode, 最近公共祖先
- LintCode-剑指Offer-(88)最近公共祖先
- [lintcode]88. 最近公共祖先
- lintcode----最近公共祖先
- lintcode--88. 最近公共祖先
- Lintcode---最近公共祖先
- 最近公共祖先-LintCode
- LintCode:最近公共祖先
- 7-1 顺序存储的二叉树的最近的公共祖先问题(25 分)
- POJ 1470 Closest Common Ancestors(最近公共祖先 LCA)
- ural 1471 Tree(最近公共祖先)
- 一般二叉树求最近公共祖先(最简单的代码)
- poj 1986 Distance Queries(最近公共祖先的tarjan算法)
- lca(洛谷P3379 最近公共祖先(LCA))
- 求二叉树中两个节点的最近公共祖先结点
- 子树/最近公共祖先
- java--数据结构--二叉树的最近公共祖先
- hdu 2586 How far away ? 最近公共祖先lca 在线算法(倍增法)/离线算法(Tarjan算法)
- 利用二叉树的非递归后序遍历求解最近公共祖先问题