题目:已知树结点为互不相等且不等于0的整数。请编写程序找出非空树中两个结点的最近公共祖先。
输入格式:
输入为2行,第1行为一组用空格间隔的整数,个数不超过100个,表示加入空指针信息的二叉树先序序列。其中空指针信息用0表示。第2行为空格间隔的两个互不相等的整数A和B,表示给定的两个结点值,保证A和B肯定在输入的树中。
注:我们已知二叉树与其自然对应的树相比,二叉树中结点的左孩子对应树中结点的左孩子,二叉树中结点的右孩子对应树中结点的右兄弟。进而我们可以利用“基于引入空指针信息的先序序列构建二叉树”的方法来构建其对应的树的左孩子–右兄弟存储结构。
输出格式:
输出为一个整数,表示A和B的最近公共祖先结点的值。
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<stack>
#define OVERFLOW 10
using namespace std;
/*struct Node
{
int data;
int father;
};
typedef struct Binode
{
int data;
Binode *left;
Binode *right;
}Binode, *Bitree;
void CreatBitree(Bitree &T)
{
int ch;
cin >> ch;
if (ch == 0) T = NULL;
else {
T = (Bitree)malloc(sizeof(Binode));
if (!T) exit(OVERFLOW);
T->data = ch;
CreatBitree(T->left);
CreatBitree(T->right);
}
}
int data[10000];
stack<int> key;
int count = 0;
void preoder(Bitree T)
{
extern int count;
extern int data[10000];
if (T == NULL)
{
data[count] = 0;
count++;
return;
}
else
{
data[count] = T->data;
count++;
preoder(T->left);
preoder(T->right);
}
}*/
int main()
{
char num;
int data[10000];
char c;
int count = 0;
while ((c=getchar()) != '\n')
{
if (c == ' ')
{
;
}
else
{
data[count] = c - '0';
count++;
}
}
int a, b;
cin >> a >> b;
int parent[10000];
stack<int> temp;
for (int i = 0;i < count;i++)
{
if (data[i] != 0)
{
temp.push(data[i]);
}
else
{
int child;
if (!temp.empty())
{
child = temp.top();
temp.pop();
}
if (temp.empty())
{
parent[child] = child;
}
else
{
parent[child] = temp.top();
}
}
}
int flag = 1;//use to tag if find the parent or not;
int aparent[10000],bparent[10000];
int ca = 0, cb = 0;
while (parent[a] != data[0])
{
aparent[ca] = parent[a];
ca++;
a = parent[a];
}
aparent[ca] = data[0];
while (parent[b] != data[0])
{
bparent[cb] = parent[b];
cb++;
b= parent[b];
}
bparent[ca] = data[0];
int res = data[0];
for (int i = 0;i <= ca;i++)
{
for (int j = 0;j <= cb;j++)
{
if (aparent[i] == bparent[j]&&flag)
{
res = aparent[i];
flag = 0;
cout << res << endl;
}
}
}
return 0;
}
//8 5 1 0 6 0 2 0 0 3 4 0 0 7 0 0 0