- 浏览: 137455 次
文章分类
- 全部博客 (189)
- Tree (14)
- Dynamic Programming (34)
- Array (20)
- Search (1)
- Hash (12)
- Backtracking (22)
- Divide and Conque (8)
- Greedy (6)
- Stack (12)
- software (0)
- List (7)
- Math (22)
- Two pointers (16)
- String (20)
- Linux (1)
- Sliding Window (4)
- Finite State Machine (1)
- Breadth-first Search (7)
- Graph (4)
- DFS (6)
- BFS (3)
- Sort (9)
- 基础概念 (2)
- 沟通表达 (0)
- Heap (2)
- Binary Search (15)
- 小结 (1)
- Bit Manipulation (8)
- Union Find (4)
- Topological Sort (1)
- PriorityQueue (1)
- Design Pattern (1)
- Design (1)
- Iterator (1)
- Queue (1)
最新评论
-
likesky3:
看了数据结构书得知并不是迭代和递归的区别,yb君的写法的效果是 ...
Leetcode - Graph Valid Tree -
likesky3:
迭代和递归的区别吧~
Leetcode - Graph Valid Tree -
qb_2008:
还有一种find写法:int find(int p) { i ...
Leetcode - Graph Valid Tree -
qb_2008:
要看懂这些技巧的代码确实比较困难。我是这么看懂的:1. 明白这 ...
Leetcode - Single Num II -
qb_2008:
public int singleNumber2(int[] ...
Leetcode - Single Num II
[分析]
最近公共祖先(LCA)是一个经典问题,以前没有好好研究过这个问题,不知道还有个Tarjan算法,今天开了眼界。一般有两种方法分别适用不同场景:
1)递归算法,适合在线单次查询,如本题;
2)Tarjan算法,适合批量查询,输入是一颗树和N对定点,为每个顶点(u,v)确定LCA。
有兴趣的同学看参考https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/03.03.md, July讲得很全面清楚。
抛开算法本身做这道题目还有些学习点:
思路1:分别求出root到p和q的路径,求两条路径从根开始的最后一个公共节点。
实现中getPath2方法暴露没有对回溯掌握得还不够好,回溯时回溯到方法调用前的状态即可,不能多也不能少,这里就属于回溯过头了。
LinkedList被当做stack使用时get(0)获得的是栈顶元素,之前错误的认为调用get(i)就类似操作ArrayList的get(i), 按加入顺序返回。
思路2:经典的递归写法,牢记树的很多问题都可以用递归解决,因为树本身是递归描述的。
最近公共祖先(LCA)是一个经典问题,以前没有好好研究过这个问题,不知道还有个Tarjan算法,今天开了眼界。一般有两种方法分别适用不同场景:
1)递归算法,适合在线单次查询,如本题;
2)Tarjan算法,适合批量查询,输入是一颗树和N对定点,为每个顶点(u,v)确定LCA。
有兴趣的同学看参考https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/03.03.md, July讲得很全面清楚。
抛开算法本身做这道题目还有些学习点:
思路1:分别求出root到p和q的路径,求两条路径从根开始的最后一个公共节点。
实现中getPath2方法暴露没有对回溯掌握得还不够好,回溯时回溯到方法调用前的状态即可,不能多也不能少,这里就属于回溯过头了。
LinkedList被当做stack使用时get(0)获得的是栈顶元素,之前错误的认为调用get(i)就类似操作ArrayList的get(i), 按加入顺序返回。
思路2:经典的递归写法,牢记树的很多问题都可以用递归解决,因为树本身是递归描述的。
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); if (left != null && right != null) return root; else return left != null ? left : right; } public TreeNode lowestCommonAncestor1(TreeNode root, TreeNode p, TreeNode q) { LinkedList<TreeNode> path1 = new LinkedList<TreeNode>(); getPath(root, p, path1); LinkedList<TreeNode> path2 = new LinkedList<TreeNode>(); getPath(root, q, path2); TreeNode lca = root; int i = path1.size() - 1, j = path2.size() - 1; while (i >= 0 && j >= 0) { if (path1.get(i) != path2.get(j)) break; lca = path1.get(i); i--; j--; } return lca; } private boolean getPath(TreeNode root, TreeNode x, LinkedList<TreeNode> path) { if (root == null) return false; path.push(root); if (root == x || getPath(root.left, x, path) || getPath(root.right, x, path)) return true; else{ path.pop(); return false; } } // Wrong version private boolean getPath2(TreeNode root, TreeNode x, LinkedList<TreeNode> path) { if (root == null) return false; path.push(root); if (root == x) { return true; } if (getPath(root.left, x, path)) return true; else { if (!path.isEmpty()) { path.pop(); } if (getPath(root.right, x, path)) return true; else if (!path.isEmpty()) { path.pop(); } } return false; }
发表评论
-
Smallest Rectangle Enclosing Black Pixels
2016-02-13 12:39 901An image is represented by a bi ... -
Inorder Successor in BST
2015-09-26 17:49 719[分析] 参考https://leetcode.com/dis ... -
Leetcode - Closest Binary Search Tree Value II
2015-09-13 14:16 787[分析] 思路1:遍历所有节点找到和 target最接近的 k ... -
Leetcode - Surrounded Regions
2015-09-02 13:41 2693[分析] 思路1:和Number of Islands类似,但 ... -
Leetcode - Number of Islands
2015-09-02 09:40 2935[分析] BFS & DFS法详见实现。 这里阐述下u ... -
Leetcode - Graph Valid Tree
2015-09-02 08:50 2272Given n nodes labeled from 0 to ... -
Leetcode - Closest Binary Search Tree Value II
2015-09-01 09:50 3183Given a non-empty binary search ... -
Leetcode - Binary Tree Upside Down
2015-08-29 18:50 415Given a binary tree where all t ... -
Leetcode - Verify Preorder Sequence in Binary Search Tree
2015-08-29 16:46 3032[分析] 思路1:暴力法,遍历当前待检查数组,找到第一个大于数 ... -
Leetcode - Converted Sorted List to BST
2015-08-23 20:07 362Given a singly linked list wher ... -
Leetcode - Strobogrammatic Number II
2015-08-22 11:34 1597A strobogrammatic number is a n ... -
Leetcode - Kth Smallest Element in BST
2015-08-11 10:26 656[分析] 思路1: 递归中序遍历,返回中序遍历中的第k个数。 ... -
Leetcode - Recover Binary Search Tree
2015-07-02 09:27 528Two elements of a binary search ... -
Leetcode - Validate Binary Search Tree
2015-07-01 08:31 595Given a binary tree, determine ... -
Leetcode - Count Complete Tree Nodes
2015-06-07 20:51 773Definition of a complete binary ... -
Leetcode - Contains Duplicate III
2015-06-07 20:08 509Given an array of integers, fi ... -
MockInterview-FindNextValue
2015-04-12 08:57 0[题目] Return the next elemen ... -
MockInterview-Implement Dictionary
2015-04-12 08:56 0[题目] Implement a dictionary, s ... -
Leetcode - Unique Binary Search Trees
2015-04-10 10:00 569[题目] Given n, how many struc ...
相关推荐
java java_leetcode题解之Lowest Common Ancestor of a Binary Tree.java
Lowest Common Ancestor of a Binary Search Tree Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on Wikipedia:...
3. **二叉树的最近公共祖先 (Lowest Common Ancestor of a Binary Tree)**:这个是在非二叉搜索树的情况下的类似问题,通常需要额外的策略来处理。 为了有效地解决这些问题,你需要熟悉二叉搜索树的遍历方法,包括...
c c语言_leetcode题解之0236_lowest_common_ancestor_of_a_binary_tree
比如"二叉树的最近公共祖先"(Lowest Common Ancestor of a Binary Tree)需要掌握树的遍历策略,而"有效的井字游戏"(Valid Tic-Tac-Toe)则需要理解博弈论的Nim游戏规则。 每道题的Markdown文件通常包含以下几个...
5. **二叉树与图**:二叉树题目如"Binary Tree Inorder Traversal"(二叉树的中序遍历)和"Lowest Common Ancestor of a Binary Tree"(二叉树的最近公共祖先),图题目如"Shortest Path in Bidirectional Graph"...
2. 树形结构:树相关的题目如“Binary Tree Inorder Traversal”(二叉树的中序遍历)和“Lowest Common Ancestor of a Binary Tree”(二叉树的最近公共祖先)等,要求对二叉树的遍历和搜索有深入理解。 3. 排序与...
例如,"二叉树的最近公共祖先"(Lowest Common Ancestor of a Binary Tree)题目,需要理解深度优先搜索或层次遍历的方法。 高级算法: 高级算法通常涉及到更深层次的思考和优化,如位运算、贪心策略、分治法等。...
2. 二叉树:例如“Lowest Common Ancestor of a Binary Tree”涉及到二叉树的遍历和节点查找。 3. 图论:如“Course Schedule II”可能涉及拓扑排序和深度优先搜索。 4. 字符串处理:如“Valid Palindrome II”要求...
4. **树结构**:如“二叉树的最近公共祖先”(Lowest Common Ancestor of a Binary Tree),需要找到给定节点的最近公共祖先。 5. **动态规划**:如“最长连续序列”(Longest Consecutive Sequence),要求找到一个...
"二叉树的最近公共祖先"(Lowest Common Ancestor of a Binary Tree)可以用递归或迭代的方法解决。 5. **图**:图问题可能涉及到深度优先搜索(DFS)、广度优先搜索(BFS)等。例如,"最短路径"(Shortest Path in...
如“二叉树的最近公共祖先”(Lowest Common Ancestor of a Binary Tree)和“拓扑排序”(Topological Sort)。 8. **动态规划**:动态规划用于解决具有重叠子问题和最优子结构的问题,如“背包问题”(Knapsack ...
例如,“二叉树的最近公共祖先”(Lowest Common Ancestor of a Binary Tree)问题,要求找到二叉树中两个节点的最近公共祖先。 8. **动态规划**:这是一种优化问题解决的策略,常用于解决背包问题、最长公共子序列...
Lowest Common Ancestor of a Binary Search Tree等。通过解决这些题目,你可以加深对二叉树的理解,并提升解决问题的能力。 总结,Java中的二叉树题目不仅要求对数据结构有深入理解,还需要灵活运用算法。不断...
12. **Lowest Common Ancestor of a Binary Search Tree**:二叉搜索树的最近公共祖先。利用二叉搜索树的性质,可以有效地向上遍历找到最近公共祖先。 13. **Product of Array Except Self**:不包含自身的数组乘积...
**RMQ(Range Minimum Query)与LCA(Lowest Common Ancestor)问题**是图论与数据结构领域中的两个重要概念,广泛应用于算法设计和优化。这篇由郭华阳所著的国家队论文深入探讨了这两个问题及其解决方案。 **RMQ...
要在控制台中运行特定问题,请转至文件test,将调用添加到测试函数( test() ),然后在控制台node <problem> (例如, node LeetcodeProblems/Lowest_Common_Ancestor_of_a_Binary_Tree.js )。 Leetcode问题 名称...
问题235:“最近的公共祖先(Lowest Common Ancestor of a Binary Search Tree)” 这是一个关于二叉搜索树的问题。在二叉搜索树中,每个节点的值都大于其左子树中的所有节点值,小于其右子树中的所有节点值。这个问题...
最近公共祖先(Lowest Common Ancestor,简称LCA)问题在图论和算法中具有重要的地位,特别是在处理树形结构的数据时。LCA问题指的是在一个树形结构中,查找两个指定节点的最近公共祖先,即离这两个节点最近的共同父...
2. **LCA (Lowest Common Ancestor)**:在树结构中,LCA算法用于寻找两个节点的最近公共祖先。递归和非递归版本都存在,递归版本通过自底向上的方式计算,非递归版本通常使用预处理和Mo's Algorithm来优化。 3. **...