求二叉树中两个节点的最近公共祖先。
要求:分别考虑以下三种情况
1、二叉树每个节点有parent(三叉链)
2、二叉树是搜索二叉树。
3、就是普通二叉树。(尽可能实现时间复杂度为O(N))
节点:
struct Node
{
int _data;
Node* _left;
Node* _right;
Node* _parent;
Node(int x)
:_data(x)
, _left(NULL)
, _right(NULL)
, _parent(NULL)
{}
};
一、二叉树每个节点有parent(三叉链)
这里介绍两种方法并提供代码实现。
第一种方法:
Node* CommonAncester0(Node* node1, Node* node2)
把从node1和node2到根节点分别看做两个单链表,定义一个指针tmp游走node2这条链表,node1每走一个节点将node2遍历一遍,同时将tmp->_parent对比,若相等,node1即为公共祖先节点;不相等继续游走。
代码如下:
Node* CommonAncester0(Node* node1, Node* node2)
{
if (node1 == NULL || node2 == NULL)
return NULL;
Node* tmp = node2;
while (node1)
{
node1 = node1->_parent;
tmp = node2;