LintCode 最近公共祖先

最近公共祖先

给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。

最近公共祖先是两个节点的公共的祖先节点且具有最大深度。

注意事项

假设给出的两个节点都在树中存在

样例

对于下面这棵二叉树

  4
 / 3   7
   /   5   6

LCA(3, 5) = 4

LCA(5, 6) = 7

LCA(6, 7) = 7

标签

LintCode 版权所有 领英 二叉树 脸书

 1 /**
 2  * Definition of TreeNode:
 3  * class TreeNode {
 4  * public:
 5  *     int val;
 6  *     TreeNode *left, *right;
 7  *     TreeNode(int val) {
 8  *         this->val = val;
 9  *         this->left = this->right = NULL;
10  *     }
11  * }
12  */
13 class Solution {
14 public:
15     /**
16      * @param root: The root of the binary search tree.
17      * @param A and B: two nodes in a Binary.
18      * @return: Return the least common ancestor(LCA) of the two nodes.
19      */
20     TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *A, TreeNode *B) {
21         // write your code here
22         TreeNode * ancestor = NULL;
23         if(root==NULL || A==NULL || B==NULL)
24             return ancestor;
25
26         vector<TreeNode *> pathA, pathB;
27         searchTree(root, A, pathA);
28         searchTree(root, B, pathB);
29
30         int sizeA=pathA.size(), sizeB=pathB.size();
31         int size = sizeA>sizeB ? sizeB : sizeA, i=0;
32         bool find = false;
33
34         for(i=0; i<size; i++)
35         {
36             if(pathA[i] != pathB[i])
37             {
38                 find = true;
39                 return ancestor;
40             }
41             else
42                 ancestor = pathA[i];
43         }
44         if(find == false)
45             ancestor = pathA[size-1];
46         return ancestor;
47     }
48
49     bool searchTree(TreeNode *root, TreeNode *node, vector<TreeNode *> &path) {
50         if(root==NULL || node==NULL) {
51             return false;
52         }
53
54         path.push_back(root);
55
56         //  找到了
57         if(root->val == node->val) {
58             return true;
59         }
60
61         if(root->left != NULL) {
62             if(searchTree(root->left, node, path)) {
63                 return true;
64             }
65         }
66         if(root->right != NULL) {
67             if(searchTree(root->right, node, path)) {
68                 return true;
69             }
70         }
71
72         //回溯
73         path.pop_back();
74         return false;
75     }
76 };
时间: 2024-10-09 20:36:42

LintCode 最近公共祖先的相关文章

lintcode 中等题:最近公共祖先 lowest common ancestor

题目 最近公共祖先 给定一棵二叉树,找到两个节点的最近公共父节点(LCA). 最近公共祖先是两个节点的公共的祖先节点且具有最大深度. 样例 对于下面这棵二叉树 4 / 3 7 / 5 6 LCA(3, 5) = 4 LCA(5, 6) = 7 LCA(6, 7) = 7 解题 不知道如何下手,参考链接,自顶向下的解法中有下面的说明: 初首先看看3和5,这两个节点分居根节点4的两侧,如果可以从子节点往父 节点递推,那么他们将在根节点4处第一次重合:再来看看5和6,这两个都在根节点4的右侧,沿着父节

50、树中两个节点的公共祖先

详细的询问: 1.该树是二叉查找树? 最近公共祖先----二叉查找树:(http://www.lintcode.com/problem/lowest-common-ancestor/) 思路:利用左子树特点:左子树 < 根 <= 右,输入节点跟根节点比较,都小于,在左子树,都大约右子树,递归的去遍历:找到当前节点在两个输入大小之间,当前节点就是. 递归和非递归 public class Solution { public TreeNode lowestCommonAncestor(TreeNo

【洛谷P3379】【模板】最近公共祖先(LCA)

题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每行包含两个正整数x.y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树). 接下来M行每行包含两个正整数a.b,表示询问a结点和b结点的最近公共祖先. 输出格式: 输出包含M行,每行包含一个正整数,依次为每一个询问的结果. 输入输出样例 输入样例#1: 5 5 4 3 1 2 4 5

[最近公共祖先] POJ 3728 The merchant

The merchant Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 4556   Accepted: 1576 Description There are N cities in a country, and there is one and only one simple path between each pair of cities. A merchant has chosen some paths and w

lca最近公共祖先(st表)

大体思路 1.求出每个元素在树中的深度 2.用st表预处理的方法处理出f[i][j],f[i][j]表示元素i上方第2^j行对应的祖先是谁 3.将较深的点向上挪,直到两结点的深度相同 4.深度相同后,祖先可能就在上方,再走几步就到了,于是两个点同时向上移 具体的方法和代码贴在下面 ↓ 具体来看 1.求出每个元素在树中的深度 //求每个节点在树中的深度 void dfs(int pos,int pre)//pre是pos的父节点 { for(int i=0;i<v[pos].size;i++)//

LCA(最近公共祖先)--tarjan离线算法 hdu 2586

HDU 2586 How far away ? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 11320    Accepted Submission(s): 4119 Problem Description There are n houses in the village and some bidirectional roads c

最近公共祖先 LCA Tarjan算法

来自:http://www.cnblogs.com/ylfdrib/archive/2010/11/03/1867901.html 对于一棵有根树,就会有父亲结点,祖先结点,当然最近公共祖先就是这两个点所有的祖先结点中深度最大的一个结点. 0 | 1 /   \ 2      3 比如说在这里,如果0为根的话,那么1是2和3的父亲结点,0是1的父亲结点,0和1都是2和3的公共祖先结点,但是1才是最近的公共祖先结点,或者说1是2和3的所有祖先结点中距离根结点最远的祖先结点. 在求解最近公共祖先为问

最近公共祖先

0. 概要 最近公共祖先,指的是在一颗有根树上,两个点的公共祖先中,深度最大的那个. 最直接的应用是求无权树上两个点的最短距离:$distance(u, v)  = depth(u) + depth(v) - 2depth(lca(u, v))$. 再有其他的应用则以后再提. 1 基于 dfs 序列上 RMQ 的稀疏表解法 首先 dfs 遍历树,如下如图中蓝色箭头的顺序.并记录: 1. 遍历点序列 $euler[] = \{1, 2, 1, 3, 5, 3, 6 ……$ 2. 每个点首次在 eu

LeetCode OJ:Lowest Common Ancestor of a Binary Tree(最近公共祖先)

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