#include <iostream>
using namespace std;
const int maxn = 100;
struct Node
{
int data;
Node *lchild, *rchild, *parent;
};
Node *p, *head, node[maxn];
int cnt = 0;
void Init()
{
p = head = NULL;
memset(node, '\0', sizeof(node));
}
void miniTree(Node* &head, Node *parent, int a[], int lower, int upper)
{
if(lower <= upper)
{
int mid = (lower + upper) >> 1;
node[cnt].data = a[mid];
node[cnt].parent = parent;
head = &node[cnt++]; //key
miniTree(head->lchild, head, a, lower, mid - 1);
miniTree(head->rchild, head, a, mid + 1, upper);
}
}
bool hasNode(Node *p, Node *n)
{
if(n == NULL)
return true;
if(p == NULL)
return false;
if(p == n)
return true;
return hasNode(p->lchild, n) || hasNode(p->rchild, n);
}
Node* firstAncestor(Node *head, Node *target1, Node *target2)
{
if(head == NULL)
return NULL;
if(!hasNode(head, target1) || !hasNode(head, target2))
return NULL;
Node *re = head;
if(hasNode(head->lchild, target1) && hasNode(head->lchild, target2))
re = firstAncestor(head->lchild, target1, target2);
else if(hasNode(head->rchild, target1) && hasNode(head->rchild, target2))
re = firstAncestor(head->rchild, target1, target2);
return re;
}
int main(void)
{
Init();
int a[] = {
1, 2, 3, 4, 5, 6, 7, 8, 9, 10
};
int len = sizeof(a) / sizeof(int);
miniTree(head, p, a, 0, len - 1);
Node *target1 = &node[2];
Node *target2 = &node[9];
Node *re = firstAncestor(head, target1, target2);
cout << re->data << endl;
return 0;
}
Q4.6
最新推荐文章于 2023-09-06 22:49:10 发布