关闭

重建二叉树

703人阅读 评论(0) 收藏 举报
分类:

根据中序遍历和前序遍历重建二叉树,同时验证是否合法。


#include <iostream>
#include <string>

using namespace std;

#define TREELEN 6

struct Node
{
	Node* pLeft;
	Node* pRight;
	char value;
};

Node* rebuild(char *preOrder, char *inOrder, int nTreeLen)
{
	Node *pTemp = new Node;
	pTemp->value = *preOrder;	
	pTemp->pLeft = NULL;
	pTemp->pRight = NULL;

	cout<<pTemp->value<<endl;

	int letter[26];
	for(int i=0; i<26; ++i)
	{
		letter[i] = 0;
	}
	// 验证前序遍历和中序遍历字符种类个数是否一致
	for(int i=0; i<nTreeLen; ++i)
	{
		char temp = *(preOrder+i);
		if(islower(temp))
		{
			letter[temp-'a']++;
		}
		else if(isupper(temp))
		{
			letter[temp-'A']++;
		}

		temp = *(inOrder+i);
		if(islower(temp))
		{
			letter[temp-'a']--;
		}
		else if(isupper(temp))
		{
			letter[temp-'A']--;
		}
	}
	for(int i=0; i<26; ++i)
	{
		if(letter[i] != 0)
		{
			cout<<"error string!"<<endl;
			throw runtime_error("error string!");
		}
	}



	if(nTreeLen == 1)
	{
		return pTemp;
	}

	// 求左右子树长度
	int leftTreeLen = 0;
	int rightTreeLen = 0;
	for(int i=0; i<nTreeLen; ++i)
	{
		if( *preOrder == *(inOrder+i) )
		{
			leftTreeLen = i;
			rightTreeLen = nTreeLen - i - 1;
			break;
		}
	}

	if(leftTreeLen > 0)
	{
		pTemp->pLeft = rebuild(preOrder+1, inOrder, leftTreeLen);
	}

	if(rightTreeLen > 0)
	{
		pTemp->pRight = rebuild(preOrder+leftTreeLen+1, inOrder+leftTreeLen+1, rightTreeLen);
	}

	return pTemp;

}

void traversal(Node* root, int flag)
{
	if(root == NULL)
		return;
	if(flag == 0)
	{
		cout<<root->value<<"\t";
		traversal(root->pLeft, flag);
		traversal(root->pRight, flag);
	}
	else if(flag == 1)
	{		
		traversal(root->pLeft, flag);
		cout<<root->value<<"\t";
		traversal(root->pRight, flag);
	}
}

int main()
{
	char preOrder[TREELEN] = {'a','b','d','c','e','f'};
	char inorder[TREELEN] = {'d','b','a','e','c','f'};

	Node* root = NULL;
	root = rebuild(preOrder, inorder, TREELEN);

	cout<<"\n前序遍历:"<<endl;
	traversal(root, 0);
	cout<<"\n中序遍历:"<<endl;
	traversal(root, 1);

}


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

剑指Offer面试题6(Java版):重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果,请重新构造出该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。例如输入的前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历为{4,7...
  • jsqfengbao
  • jsqfengbao
  • 2015-07-27 18:36
  • 4849

数据结构:关于重建二叉树的三种思路

如果,告诉你有一棵二叉树前序遍历的结果为:ABC;中序遍历的结果为:BAC。我们可以很轻松地写出这棵二叉树就是以A为根节点、其左孩子是B、右孩子是C。那么从代码的角度,或者说是从算法的角度又要怎么来编...
  • u013761665
  • u013761665
  • 2015-11-24 00:27
  • 4652

JAVA实现重建二叉树(《剑指offer》)

最近在刷《剑指offer》里的编程题,但是网上关于《剑指offer》的解答多半是C或者C++的,而且官方(作者)也是在用C++进行讲解,这里自己用java写了一些题目的解答代码(当然也有部分是借鉴了网...
  • qq_15062527
  • qq_15062527
  • 2015-10-01 15:39
  • 2733

前序和中序重建二叉树并包含父节点

  • 2017-08-03 09:53
  • 2KB
  • 下载

数据结构课程设计二叉树重建报告

  • 2010-08-29 10:27
  • 175KB
  • 下载

数据结构课程设计二叉树的重建

  • 2010-08-29 10:25
  • 15KB
  • 下载

重建二叉树-----(源自编程之美)

  • 2011-09-26 20:54
  • 2KB
  • 下载

二叉树的重建java代码

  • 2015-12-01 10:46
  • 2KB
  • 下载

中山大学 sicily 二叉树重建

  • 2012-10-31 15:33
  • 2KB
  • 下载

二叉树重建 sicily1935

  • 2011-05-17 21:11
  • 15KB
  • 下载
    个人资料
    • 访问:592077次
    • 积分:7631
    • 等级:
    • 排名:第3263名
    • 原创:190篇
    • 转载:6篇
    • 译文:0篇
    • 评论:98条
    博客专栏
    文章分类
    最新评论