题目描述
给定一棵二叉树以及这棵树上的两个节点 o1 和 o2,请找到 o1 和 o2 的最近公共祖先节点。
示例1
输入
[3,5,1,6,2,0,8,#,#,7,4],5,1
返回值
3
思路:
首先层序遍历整棵树上的所有结点,对树上每个结点都分别作为根结点,层序遍历其子树,看该子树中是否有o1和o2。如果子树中有o1和o2,则该子树的根结点是o1和o2的公共祖先之一。每次满足条件时min都更新,最终得到的min就是最近公共祖先结点的val值。
C++实现:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @param o1 int整型
* @param o2 int整型
* @return int整型
*/
int lowestCommonAncestor(TreeNode* root, int o1, int o2) {
// write code here
queue<TreeNode*> Q;
queue<TreeNode*>q;
Q.push(root);
TreeNode* T,*t;
int flag1=0,flag2=0;
int min=1000;
//首先层序遍历整棵树,对树上每个结点都分别作为根结点,层序遍历其子树,看该子树中是否有o1和o2。每次满足条件时min都更新,最终得到的min就是最近公共祖先结点
while(!Q.empty())
{
T = Q.front();
Q.pop();
if(T->left!=NULL)
{
Q.push(T->left);
}
if(T->right!=NULL)
{
Q.push(T->right);
}
//以T为根结点,遍历该子树,看该子树中是否有o1和o2
flag1=0;flag2=0; //如果有o1,flag1置1;如果有o2,flag2置1
q.push(T);
while(!q.empty())
{
t = q.front();
q.pop();
if(t->val==o1)
{
flag1=1;
}
if(t->val==o2)
{
flag2=1;
}
if(t->left!=NULL)
{
q.push(t->left);
}
if(t->right!=NULL)
{
q.push(t->right);
}
}
if(flag1&&flag2) //子树中找到o1和o2,则T是o1和o2的公共祖先之一,更新min值
{
min = T->val;
}
}
return min;
}
};