Week 4 Problem 3

题目:已知树结点为互不相等且不等于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不停---

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值