这个题可以先画树来看看,要知道它们共同的父亲就好了,可是共同父亲怎么知道呢?那我们从它的左子树和右子树找这两个节点。
来看个图比较好理解点吧,
如果当前节点是两个节点的共同父亲,或者是图中那种描述呢
直接来看C++代码吧
typedef struct Node{
Node* left;
Node* right;
int val;
Node(int v):val(v),left(NULL),right(NULL){}
}Node,*pNode;
int NodeDistance(pNode root,pNode first,pNode second,int &dist)
{
if(root==NULL)
return 0;
int va=0;
if(root==first||root==second)
va=1;
int valeft=NodeDistance(root->left,first,second,dist);
int varight=NodeDistance(root->right,first,second,dist);
if(!dist)
{
if(valeft*va||varight*va||varight*valeft)
{
dist=varight+valeft;
return 0;
}
else
if(va||varight||valeft)
return va?va:varight+valeft+1;
}
return 0;
}
最后给个测试用例吧
void main()
{
pNode root=new Node(1);
root->left=new Node(2);
root->right=new Node(3);
root->left->left=new Node(6);
root->left->right=new Node(7);
root->right->left=new Node(8);
root->right->right=new Node(9);
root->left->left->right=new Node(10);
root->left->left->left=new Node(11);
root->right->left->left=new Node(12);
root->right->left->left->right=new Node(13);
int d=0;
NodeDistance(root,root->right->left->left->right,root->left->right,d);
while(1);
}