码迷,mamicode.com
首页 > 其他好文 > 详细

最近公共祖先 LCA 递归非递归

时间:2019-06-16 13:57:22      阅读:107      评论:0      收藏:0      [点我收藏+]

标签:遍历二叉树   def   div   tree   ||   深度优先遍历   返回   solution   左右子树   

给定一棵二叉树,找到两个节点的最近公共父节点(LCA)。
最近公共祖先是两个节点的公共的祖先节点且具有最大深度。
假设给出的两个节点都在树中存在。

dfs递归写法

查找两个node的最近公共祖先,分三种情况:

  1. 如果两个node在root的两边,那么最近公共祖先就是root。
  2. 如果两个node在root的左边,那么把root的左子树作为root,再递归。
  3. 如果两个node在root的右边,那么把root的右子树作为root,再递归。

深度优先遍历二叉树,一旦找到了两个节点其中的一个,就将这个几点返回给上一层,上一层节点通过判断其左右子树中是否恰好包含n1和n2两个节点,如果找到,对应的上一层节点肯定是所求的LCA;若果不是,将包括两个节点中任意一个的较低的节点返回给上一层,否则返回NULL。

 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 
14 
15 class Solution {
16 public:
17     /*
18      * @param root: The root of the binary search tree.
19      * @param A: A TreeNode in a Binary.
20      * @param B: A TreeNode in a Binary.
21      * @return: Return the least common ancestor(LCA) of the two nodes.
22      */
23     TreeNode * lowestCommonAncestor(TreeNode * root, TreeNode * A, TreeNode * B) {
24         // write your code here
25         //如果当前节点为空,或者与目标节点中的一个相同,则返回该节点
26         if(root == NULL)    return NULL;
27         if(root==A || root==B)  return root;
28         
29         //递归寻找A B在左右子树的位置
30         TreeNode* left = lowestCommonAncestor(root->left,A,B);
31         TreeNode* right = lowestCommonAncestor(root->right,A,B);
32         
33         //如果A B分别位于root的两侧,则root是他们的LCA,否则是左子树或者右子树
34         if(left&&right) return root;
35         
36         return left?left:right;
37         
38         
39     }
40 };

非递归:

 

最近公共祖先 LCA 递归非递归

标签:遍历二叉树   def   div   tree   ||   深度优先遍历   返回   solution   左右子树   

原文地址:https://www.cnblogs.com/demian/p/11031113.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!