首页 > 代码库 > POJ 2255 Tree Recovery 二叉树恢复

POJ 2255 Tree Recovery 二叉树恢复

一道和Leetcode的一道题目基本上一样的题目。

给出前序遍历和中序遍历序列,要求根据这些信息恢复一颗二叉树的原貌,然后按后序遍历序列输出。

Leetcode上有给出后序和中序,恢复二叉树的。

不过其实算法都是一样的。仿佛又回到了做Leetcode题的那段岁月中了。

还有就是输入是我特别处理过的,就两个函数,大家会了的无视,不会的可以学习下。

#include <stdio.h>
#include <string>
#include <algorithm>
using std::string;

const int MAX_B = 1024;
char buf[MAX_B];
int id = 0, len = 0;

inline char getFromBuf()
{
	if (id >= len)
	{
		len = fread(buf, 1, MAX_B, stdin);
		id = 0;
	}
	return buf[id++];
}

void getStrFromBuf(string &n)
{
	char a = getFromBuf();
	while ((a == ' ' || a == '\n') && len) a = getFromBuf();
	
	n.clear();
	while ((a != ' ' && a != '\n') && len)//老是写&&,错成||
	{
		n.push_back(a);
		a = getFromBuf();
	}
}

struct Node
{
	char alpha;
	Node *left, *right;
	explicit Node (char a = ' ') : alpha(a), left(NULL), right(NULL) {}
};

Node *recover(string &preo, int p1, int p2, string &ino, int i1, int i2)
{
	if (p1 > p2) return NULL;
	Node *root = new Node(preo[p1]);

	int off = 0;
	for ( ; ino[i1+off] != preo[p1]; off++);

	root->left = recover(preo, p1+1, p1+off, ino, i1, i1+off-1);
	root->right = recover(preo, p1+off+1, p2, ino, i1+off+1, i2);
	return root;
}

void releaAndPrintTree(Node *r)
{
	if (r)
	{
		releaAndPrintTree(r->left);
		releaAndPrintTree(r->right);
		putchar(r->alpha);
		delete r; r = NULL;
	}
}

int main()
{
	string preo, ino;
	while (true)
	{
		getStrFromBuf(preo);
		if (len == 0) break;
		getStrFromBuf(ino);
		releaAndPrintTree(recover(preo, 0, (int)preo.size()-1, ino, 0, (int)ino.size()-1));
		putchar('\n');
	}
	return 0;
}