如何求树中的两个节点的最近公共祖先?

如何求树中的两个节点的最近公共祖先?

看到别人的一个比较好的写法如下,大多数人的写法是把父节点存入数组,然后遍历父节点数组寻找最后一个相同节点

或者用含有指向父节点指针的树结构,向上遍历父节点找第一个相同节点为最近祖先节点

struct Node
{
int data;
Node* left;
Node* right;
};


int fun(Node* root,Node* ptr1,Node* ptr2,Node** out)
{
if(root==NULL)
return 0;
if(root==ptr1||root==ptr2)
return 1;
int leftint=0,rightint=0;


leftint= fun(root->left,ptr1,ptr2,out);
if(leftint==2)
return 2;


rightint=fun(root->right,ptr1,ptr2,out);
if(rightint==2)
return 2;
}


if(leftint+rightint==2)
*out=root;
return leftint+rightint;
}


int main()
{
Node* root=...;
Node* ptr1=...;
Node* ptr2=...;
Node* out;
int n=fun(root,ptr1,ptr2,&out);
if(n==2)
cout<<"result node is: "out->data<<endl;
else
cout<<"Node not exist...";

return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值