236. Lowest Common Ancestor of a Binary Tree**
来源:互联网 发布:电信网络电视要收费吗 编辑:程序博客网 时间:2024/06/05 02:48
Given a binary tree, find the lowest common ancestor (LCA) of two given nodes in the tree.
According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes v and w as the lowest node in T that has both v and w as descendants (where we allow a node to be a descendant of itself).”
_______3______ / \ ___5__ ___1__ / \ / \ 6 _2 0 8 / \ 7 4
For example, the lowest common ancestor (LCA) of nodes 5
and 1
is 3
. Another example is LCA of nodes 5
and 4
is 5
, since a node can be a descendant of itself according to the LCA definition.
My code:
/** * 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) { if(root==null) return null; while(root!=null){ if (isAncestor(root.left,p)&&isAncestor(root.left,q)) root=root.left; else if (isAncestor(root.right,p)&&isAncestor(root.right,q)) root=root.right; else return root; } return root; } private boolean isAncestor(TreeNode root, TreeNode p){ if(root==null) return false; return root==p||isAncestor(root.left,p)||isAncestor(root.right,p); }}总结:时间复杂度太高,超时了。isAncestor每次只是检查是不是ancestor,而没有检查是不是lowestAncestor。再加上while循环,每个结点都会被上方的节点访问。
Reference:
public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root==null||root==p||root==q) return root; TreeNode left = lowestCommonAncestor(root.left,p,q); TreeNode right = lowestCommonAncestor(root.right,p,q); return left ==null?right:right ==null?left:root; }}
Iterative:
public class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { Map<TreeNode, TreeNode> parent = new HashMap<>(); Deque<TreeNode> stack = new ArrayDeque<>(); parent.put(root, null); stack.push(root); while (!parent.containsKey(p) || !parent.containsKey(q)) { TreeNode node = stack.pop(); if (node.left != null) { parent.put(node.left, node); stack.push(node.left); } if (node.right != null) { parent.put(node.right, node); stack.push(node.right); } } Set<TreeNode> ancestors = new HashSet<>(); while (p != null) { ancestors.add(p); p = parent.get(p); } while (!ancestors.contains(q)) q = parent.get(q); return q; }}
0 0
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree(***)
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Lowest Common Ancestor of a Binary Tree
- Bootstrap学习---css
- [FUNC]测试是否联网
- 教女友学编程-2-先学爬虫
- 【易语言界面开发系列教程之(EX_UI使用系列教程--EX组件(一键换肤))】
- 1222
- 236. Lowest Common Ancestor of a Binary Tree**
- Opencv 编译静态库
- JZOJ4925. 稻草人
- 集合框架_去除ArrayList集合中的重复字符串元素案例2
- taskmgr任务管理器
- bootstrap框架学习笔记二(表单、按钮)
- 【网络攻防】第一章 准备
- 1032. Sharing (25)
- linux中shell的小括号、大括号的用法区别