有如下树,求最低公共父节点
#include <iostream>
#include <vector>
using namespace std;
struct Node
{
Node(int c = 0) : data(c) {}
int data;
vector<Node*> nvec;
};
Node* construct(Node *&left, Node *&right)
{
Node *node10 = new Node(10);
Node *node9 = new Node(9);
Node *node8 = new Node(8);
Node *node7 = new Node(7);
Node *node6 = new Node(6);
Node *node5 = new Node(5);
node5->nvec.push_back(node8);
node5->nvec.push_back(node9);
node5->nvec.push_back(node10);
Node *node4 = new Node(4);
node4->nvec.push_back(node6);
node4->nvec.push_back(node7);
Node *node3 = new Node(3);
Node *node2 = new Node(2);
node2->nvec.push_back(node4);
node2->nvec.push_back(node5);
Node *node1 = new Node(1);
node1->nvec.push_back(node2);
node1->nvec.push_back(node3);
left = node8;
right = node10;
return node1;
}
Node* lowestCommon(Node *root, Node *left, Node *right, Node *&newRoot)
{
if (root == NULL || left == NULL || right == NULL)
return NULL;
if (root == left || root == right)
{
return root;
}
vector<Node*> nodes;
for (int i = 0; i < root->nvec.size(); i++)
{
Node *ret = lowestCommon(root->nvec[i], left, right, newRoot);
nodes.push_back(ret);
}
int mycount = 0;
for (int i = 0; i < nodes.size(); i++)
{
if (nodes[i] != NULL)
mycount++;
}
if (mycount == 2)
{
newRoot = root;
return root;
}
else if (mycount == 1)
return root;
else
return NULL;
}
void main()
{
Node *left = NULL;
Node *right = NULL;
Node *root = construct(left, right);
cout << left->data << endl;
cout << right->data << endl;
Node *newRoot = NULL;
Node *ret = lowestCommon(root, left, right, newRoot);
if (newRoot != NULL)
{
cout << "father: " << newRoot->data << endl;
}
}