菜菜

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题意:

根据二叉树中序和后序建立二叉树,从根结点开始计算和到叶子结点,输出总和最小的叶子结点,如果有俩个和一样大,输出叶子结点最小的

AC:80ms

#include<stdio.h>
#include<iostream>
#include <strstream>
#include<string>
#include<memory.h>
#include<sstream>
using namespace std;
struct Tree
{
	int curTotal;
	Tree()
	{
		curTotal = 0;
	}
};
void buildTree(const int* in, const int* post, int curTotal, int* minTotal,
		int tl, int * leaf);
int readInt(string str, int * const a)
{
	istringstream in(str);
	int i;
	int total = 0;
	while (in >> i)
		a[total++] = i;
	return total;
}

int main()
{
	//freopen("d:\\1.txt", "r", stdin);
	string str1, str2;
	while (getline(cin, str1))
	{
		getline(cin, str2);
		int inorder[100000];
		int postorder[100000];
		int tl = readInt(str1, inorder);
		readInt(str2, postorder);
		int min = 0x7FFFFFFF;
		int leaf = 0x7FFFFFFF;
		buildTree(inorder, postorder, 0, &min, tl, &leaf);
		cout << leaf << endl;
	}
}
void buildTree(const int* in, const int* post, int curTotal, int* minTotal,
		int tl, int * leaf)
{
	if (tl == 0)
		return;
	int cur = -1;
	for (int i = 0; i < tl; i++)
	{
		if (in[i] == post[tl - 1])
		{
			cur = i;
			break;
		}
	}
	//左孩子长度cur
	int left = cur;
	//right长度 tl-cur-1
	int right = tl - cur - 1;
	curTotal += in[cur];
	if (tl == 1)
	{
		if (curTotal <= *minTotal)
		{
			*minTotal = curTotal;
			*leaf = in[cur];
		}
	}

	//left
	buildTree(in, post, curTotal, minTotal, left, leaf);
	//right
	buildTree(in + left + 1, post + left, curTotal, minTotal, right, leaf);
}

  

posted on 2017-05-09 15:32  好吧,就是菜菜  阅读(139)  评论(0编辑  收藏  举报