二叉树给出两种遍历序列(含中序遍历)创建一颗先序遍历二叉树

没有测试太多的例子,不知正确性怎样。。。

#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
#define ms(x,y) memset(x,y,sizeof(x))
const int MAXN=1000+10;
const int INF=1<<30;
using namespace std;

struct Node
{
	char ch;
	Node *left, *right;
};

//给出先序遍历和中序遍历创建先序二叉树
void BuildTree1(Node *&root, int n, char const *pre, char const *mid)
{
	if(n <= 0) return;//子树长度为0

	root = (Node *)malloc(sizeof(Node));
	root->ch = *pre;
	root->left = NULL;
	root->right = NULL;

	const char *p = strchr(mid, *pre);//头结点在中序遍历顺序中的位置
	int k = p - mid;//左子树的长度
	BuildTree1(root->left, k, pre+1, mid);
	BuildTree1(root->right, n-1-k, pre+k+1, mid+k+1);
}

//给出后序遍历和中序遍历创建先序二叉树
void BuildTree2(Node *&root, int n, char const *post, char const *mid)
{
	if(n <= 0) return;//子树长度为0

	root = (Node *)malloc(sizeof(Node));
	root->ch = *post;
	root->left = NULL;
	root->right = NULL;

	const char *p = strchr(mid, *post);//头结点在中序遍历顺序中的位置
	int k = p - mid;//左子树的长度
	BuildTree2(root->right, n-1-k, post-1, mid+k+1);
	BuildTree2(root->left, k, post-(n-1-k)-1, mid);
}

void PreOrder(Node *root)
{
    if(root == NULL) return;
    printf("%c", root->ch);
    PreOrder(root->left);
    PreOrder(root->right);
}  

int main()
{
	freopen("in.txt","r",stdin);
	char pre[100], mid[100], post[100];
#if 0
	scanf("%s%s", pre, mid);
#endif
	scanf("%s%s", post, mid);
#if 0
	Node *root;
	int len = strlen(pre);
	BuildTree1(root, len, pre, mid);
#endif

	Node *root;
	int len = strlen(post);
	BuildTree2(root, len, post+len-1, mid);

	PreOrder(root);
	printf("\n");
	return 0;
}
时间: 2024-10-13 20:34:47

二叉树给出两种遍历序列(含中序遍历)创建一颗先序遍历二叉树的相关文章

已知前序(后序)遍历序列和中序遍历序列构建二叉树(Leetcode相关题目)

1.文字描述: 已知一颗二叉树的前序(后序)遍历序列和中序遍历序列,如何构建这棵二叉树? 以前序为例子: 前序遍历序列:ABCDEF 中序遍历序列:CBDAEF 前序遍历先访问根节点,因此前序遍历序列的第一个字母肯定就是根节点,即A是根节点:然后,由于中序遍历先访问左子树,再访问根节点,最后访问右子树,所以我们找到中序遍历中A的位置,然后A左边的字母就是左子树了,也就是CBD是根节点的左子树:同样的,得到EF为根节点的右子树. 将前序遍历序列分成BCD和EF,分别对左子树和右子树应用同样的方法,

由后序遍历序列和中序遍历序列确定二叉树

如何通过后序遍历序列和中序遍历序列来确定一棵二叉树?? 根据后序遍历序列最后一个结点确定根结点: 根据根结点在中序遍历序列中分割出左右两个子序列: 对左子树和右子树分别递归使用相同的方式继续分解: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 struct node 6 { 7 char data; 8 struct node *lt, *rt; 9 }; 10 11 // 用先

由先序遍历序列和中序遍历序列确定二叉树

如何通过先序遍历序列和中序遍历序列来确定一棵二叉树? 根据先序遍历序列第一个结点确定根结点: 根据根结点在中序遍历序列中分割出左右两个子序列: 对左子树和右子树分别递归使用相同的方式继续分解: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 5 struct node 6 { 7 char data; 8 struct node *lt, *rt; 9 }; 10 11 // 用先序序

mysql 执行 cannot found mac安装mysql的两种方法(含配置)

mac安装mysql的两种方法(含配置 此时我们在命令行输入mysql -uroot -p命令会提示没有commod not found,我们还需要将mysql加入系统环境变量. (1).进入/usr/local/mysql/bin,查看此目录下是否有mysql,见pic6. (2).执行vim ~/.bash_profile 在该文件中添加mysql/bin的目录,见pic7: PATH=$PATH:/usr/local/mysql/bin 添加完成后,按esc,然后输入wq保存. 最后在命令

已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列

题目描述 输入二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列. 输入 第一行输入二叉树的先序遍历序列: 第二行输入二叉树的中序遍历序列. 输出 输出该二叉树的后序遍历序列. 示例输入 ABDCEF BDAECF 示例输出 DBEFCA #include <iostream> #include <cstring> #define MAX 50+3 using namespace std; typedef char Elem_Type; typedef struct B

C++ 根据前序遍历序列和中序遍历序列可以构造唯一的二叉树

文章转载自http://blog.csdn.net/touzani/article/details/1637195 根据前序遍历序列和中序遍历序列可以构造唯一的二叉树. 假设序列为string型 根据前序遍历的特点, 知前序序列(Pre)的首个元素(Pre[0])为根(root), 然后在中序序列(In)中查找此根(Pre[0]), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为左子树, 后边的序列为右子树. 设根前边有left个元素.. 则又有, 在前序序列中, 紧跟着根(roo

二叉树系列(一):已知先序遍历序列和中序遍历序列,求后序遍历序列

首先介绍一下三种遍历顺序的操作方法: 1.先序遍历 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树.  2.中序遍历 (1)中序遍历左子树: (2)访问根结点: (3)中序遍历右子树. 3.后序遍历 (1)后序遍历左子树: (2)后序遍历右子树: (3)访问根结点. 知道了二叉树的三种遍历规则,只要有中序遍历序列和前后任一种遍历序列,我们就可以求出第三种遍历序列,今天我们研究的是已知先序和中序遍历序列,求后序遍历序列. 已知该二叉树的先序遍历序列为:A-B-D-E-G-C-F,

根据二叉树的先序遍历序列和中序遍历序列求后序遍历序列

由先序遍历和中序遍历序列可唯一还原出二叉树,前提条件是所有节点的关键字无重复. 题目来源:http://hihocoder.com/problemset/problem/1049 代码: 1 #include <iostream> 2 #include <string> 3 4 using namespace std; 5 6 void post_order(string pre, string in) 7 { 8 size_t len = pre.length(); 9 if(l

已知二叉树的先序遍历序列和中序遍历序列,求后序遍历序列。

思路: 先序序列的第一个结点为要构造二叉树的根结点,在中序序列中查找二叉树的根结点,则中序列根结点左边为根结点的左子树的中序序列,右边为根结点的右子树的中序序列.而先序序列根结点后面分别为它的左子树和右子树的先序序列.有了根结点在中序序列的位置,就知道了左子树和右子树的先序序列各自的位置.这样,就知道了根结点两个子树的序列. 然后在构造了根结点后,就可以递归调用函数来勾结根结点的左子树和右子树. 以上为二叉树的恢复. 后序遍历二叉树也是用递归即可. 代码如下: string.find()   返