根据二叉树的先序序列和中序序列还原二叉树并打印后序序列

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;

struct Node
{
	int value;
	Node *left;
	Node *right;
	Node(int value)
	{
		this->value = value;
		left = right = NULL;
	}
};

bool bNotTree = false;
Node* RebuildTree(int *preOrder, int *inOrder, int length)
{
	if (length <= 0)
		return NULL;
	if (length == 1)
	{
		if (*preOrder != *inOrder)
		{
			bNotTree = true;
			return NULL;
		}
		return new Node(*preOrder);
	}

	int i;
	for (i = 0; *preOrder != inOrder[i] && i < length; ++i);
	if (i == length)
	{
		bNotTree = true;
		return NULL;
	}
	Node *root = new Node(*preOrder);
	root->left = RebuildTree(preOrder+1,inOrder,i);
	root->right = RebuildTree(preOrder + i + 1, inOrder + i + 1,length-i-1);
	return root;
}

void PrintTree(Node* root)
{
	if (root)
	{
		PrintTree(root->left);
		PrintTree(root->right);
		cout << root->value << " ";
	}
}

int main()
{
	int preOrder[1000];
	int inOrder[1000];

	int n;
	while (cin >> n)
	{
		int i;
		bNotTree = false;
		for (i = 0; i < n; ++i)
		{
			cin >> preOrder[i];
		}
		for (i = 0; i < n; ++i)
		{
			cin >> inOrder[i];
		}
		Node *tmp = RebuildTree(preOrder, inOrder, n);
		if (bNotTree)
			cout << "No" << endl;
		else
		{
			PrintTree(tmp);
			cout << endl;
		}
	}
	return 0;
}

根据二叉树的先序序列和中序序列还原二叉树并打印后序序列,布布扣,bubuko.com

时间: 2024-10-12 03:39:53

根据二叉树的先序序列和中序序列还原二叉树并打印后序序列的相关文章

根据二叉树的中序遍历和前序遍历,还原二叉树

现在有一个问题,已知二叉树的前序遍历和中序遍历:PreOrder:         GDAFEMHZInOrder:            ADEFGHMZ我们如何还原这颗二叉树,并求出他的后序遍历? 我们基于一个事实:中序遍历一定是 { 左子树中的节点集合 },root,{ 右子树中的节点集合 },前序遍历的作用就是找到每颗子树的root位置. 算法1输入:前序遍历,中序遍历1.寻找树的root,前序遍历的第一节点G就是root.2.观察前序遍历GDAFEMHZ,知道了G是root,剩下的节点

C++ 查询一个序列是否可能是一个二叉搜索树的后序遍历

其中,最重要的是,sequence一开始如果它的值为空的话,它是要返回false.但是之后,只要sizex小于3都应该返回true class Solution {public: bool VerifySquenceOfBST(vector<int> sequence) { if (sequence.size() == 0) { return false; } return VerifySquenceOfBSTChild(sequence); } bool VerifySquenceOfBST

9判断整数序列是不是二元查找树的后序遍历结果

转载请注明出处:http://www.cnblogs.com/wuzetiandaren/p/4252095.html 声明:现大部分文章为寻找问题时在网上相互转载,此博是为自己做个记录记录,方便自己也方便有类似问题的朋友,本文的思想也许有所借鉴,但源码均为本人实现,如有侵权,请发邮件表明文章和原出处地址,我一定在文章中注明.谢谢. 题目:输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 解题思路: 1.输入一个整型数组a,根据该数组创建二

算法进化历程之“根据二叉树的先序和中序序列输出后序序列”

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 前不久在看到一个作业"根据二叉树的先序和中序序列输出后序序列",当时我参考<数据结构与算法(C语言)习题集>上的做法,先根据先中序序列确定一颗二叉树,然后后序遍历二叉树输出后序序列. 函数采用了递归算法,利用函数传入的先序和中序序列的左右边界,确定要处理的序列段,生成相应的二叉树. 基本思路是,把该段先序序列的第一个元素作为当前二叉树的根结点,然后在中序序列找到根结点.根结点

判断序列是否是二叉树的后序遍历序列

这个题的意思就是给定一个序列,判断这个序列是否是某个二叉排序树的后序遍历序列,这个算法的方法主要是根据后序遍历的性质,首先这个序列的最后一个元素肯定是根元素,然后将序列从左往右遍历,找到第一个大于根元素的点,这个点左边的肯定是当前根的左子树,这个点的右边肯定是当前根的右子树,继续向后遍历,看右子树中是否有值小于根,如果有,则false,否则分左右子树分别再次调用函数进行判断.具体代码如下: 1 public class IsLastOrder{ 2 3 public boolean islast

二叉树的前序中序后序遍历相互求法

二叉树的前中后序遍历,他们的递归非递归.还有广度遍历,参见二叉树的前中后序遍历迭代&广度遍历和二叉树的前中后序遍历简单的递归 现在记录已知二叉树的前序中序后序遍历的两个,求另外一个.一般,这两个中一定有中序遍历. 1.已知前序和中序,求后序遍历: 前序:ABDECFG  中序:DBEAFCG 思路简单:前序的第一个节点就是根节点, 中序中找到根节点的位置,根节点之前是其左子树,之后是右子树   按此顺序,依次在左子树部分遍历,右子树部分遍历 C++ 代码: TreeNode *BinaryTre

二叉树 层序、前序、中序、后序遍历。

简单二叉树     public  class Node<T>     {         private T _data;         private Node<T> _leftChild;         private Node<T> _rightChild;         private Node<T> _Parent;         private int flag;         public  Node(){}         pub

二叉树的先序、中序、后序遍历

二叉树的遍历方法有多种,首先我想先改变这几个遍历的名字(前根序遍历,中根序遍历,后根序遍历):前中后本来就是相对于根结点来说的,少一个字会产生很多不必要的误解. 先简单描述一下这三种遍历方法的区别: 先序遍历:先遍历根结点,然后遍历左子树,最后遍历右子树.上图中的先序遍历结果是ABDHECFG 中序遍历:先遍历左子树,然后遍历根结点,最后遍历右子树.上图中的中序遍历结果是HDBEAFCG 后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点.上图中的后序遍历结果是HDEBFGCA 先序遍历:

图的建立及输出其先序序列,中序序列,后续序列

1 #include<stdio.h> 2 #include<malloc.h> 3 typedef struct node{ 4 char data; 5 struct node *left; 6 struct node *right; 7 }Node; 8 9 int i = 0; 10 char str[100]; 11 12 void create(Node** p){ 13 if(str[i] == '\0') 14 return ; 15 if(str[i++] !=