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

文章转载自http://blog.csdn.net/touzani/article/details/1637195

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

假设序列为string型

根据前序遍历的特点, 知前序序列(Pre)的首个元素(Pre[0])为根(root), 然后在中序序列(In)中查找此根(Pre[0]), 根据中序遍历特点, 知在查找到的根(root) 前边的序列为左子树, 后边的序列为右子树。 设根前边有left个元素.. 则又有, 在前序序列中, 紧跟着根(root)的left个元素序列(即Pre[1...left]) 为左子树, 在后边的为右子树..而构造左子树问题其实跟构造整个二叉树问题一样,只是此时前序序列为Pre[1...left]), 中序序列为In[0...left-1],
分别为原序列的子串, 构造右子树同样, 显然可以用递归方法解决。

因此算法可以描述为:

build_tree(sub_root, Pre, In)

1。if ( size( Pre) > 0)

2。 sub_root =new Node (Pre[0] );

3。 Index = Pre[0]在In中的位置

4。 In_left = In[0...Index-1] , In_right = In[Index...]

5。 Pre_left =Pre[1..Index], Pre_righ = Pre[Index+1...]

6。 build_tree(sub_root->left , Pre_left, In_left)

7。 build_tree(sub_root->right, Pre_right, Pre_right)

C++代码如下:

template <class Entry>

Binary_tree<Entry>::Binary_tree(string p, string s)

/* p是二叉树的先序序列,s是二叉树的中序序列。算法建立二叉树,使其先序序列和中序序列分别为p和s。

uses: pre_in_build

*/

{

pre_in_build(root, p, s);

}

template <class Entry>

void Binary_tree<Entry>::pre_in_build(Binary_node<Entry> *&sub_root, string pre, string in)

{

if(pre.length() > 0)

{

sub_root=new Binary_node<char> (pre[0]);

int index=in.find(pre[0]);

string in_left_str=in.substr(0, index);

string in_right_str=in.substr(index+1);

string pre_left_str=pre.substr(1, index);

string pre_right_str=pre.substr(index+1);

pre_in_build(sub_root->left, pre_left_str, in_left_str);

pre_in_build(sub_root->right, pre_right_str, in_right_str);

}

}

string 类返回子串函数

basic_string substr( size_type _Off = 0, size_type _Count = npos )

参数说明:

_Off 为开始的下标, 默认为0。

_Count为子串的大小, 默认从开始到串的末尾。

npos = -1; 代表not found 或all remaining characters

返回子串string

如果_Count =0, 则返回为空的string

如果下标_Off >= length, 亦返回空string

时间: 2024-12-20 00:21:53

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

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

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

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

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

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

如何通过后序遍历序列和中序遍历序列来确定一棵二叉树?? 根据后序遍历序列最后一个结点确定根结点: 根据根结点在中序遍历序列中分割出左右两个子序列: 对左子树和右子树分别递归使用相同的方式继续分解: 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 // 用先序序

已知二叉树的前序遍历结果和中序遍历结果,请重建原来的二叉树

分析的过程: 1.假设前序遍历的第一个值为a,该值就是原二叉树的根节点. 2.在中序遍历结果中查找a. 则在中序遍历中a前面的节点,就是原二叉树a节点左子树的中序遍历结果:在a后面的节点,就是原二叉树a节点右子树的中序遍历结果. 3.由第二步得到a节点左子树的节点个数为m,那么在前序遍历中a后面的m个节点即为a节点左子树的前序遍历结果: 4.由第二步得到a节点右子树的节点个数为n,那么在前序遍历中最后n个节点即为a节点右子树的前序遍历结果: 由此我们可以得到a节点左子树和右子树的前序遍历和中序遍

七:重建二叉树(根据先序遍历(或者后序遍历)和中序遍历重建二叉树)

对于一颗二叉树,可以根据先序遍历(或者后序遍历)和中序遍历(树中不含重复的数字)重新还原出二叉树. 解析: 1. 先序遍历序列的第一个元素必定是根节点,可以由此获取二叉树的根节点. 2. 根据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必定在根节点的左子树中,而根节点右边的序列必定在右子树中.由此可以知道先序遍历中左子树以及右子树的起止位置. 3. 找到了左右子树前序遍历和中序遍历再用同样的方法分别构建左右子树,典型的递归思想. 代码如下: Binary

七:重建二叉树(依据先序遍历(或者后序遍历)和中序遍历重建二叉树)

对于一颗二叉树.能够依据先序遍历(或者后序遍历)和中序遍历(树中不含反复的数字)又一次还原出二叉树. 解析: 1. 先序遍历序列的第一个元素必然是根节点,能够由此获取二叉树的根节点. 2. 依据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必然在根节点的左子树中.而根节点右边的序列必然在右子树中.由此能够知道先序遍历中左子树以及右子树的起止位置. 3. 找到了左右子树前序遍历和中序遍历再用相同的方法分别构建左右子树,典型的递归思想. 代码例如以下: Bin

用一棵二叉树的前序遍历结果和中序遍历结果还原这棵二叉树——6

输入某二叉树的前序遍历和中序遍历的结果,重建出这棵二叉树,假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出这棵满足前序遍历和中序遍历的二叉树并输出它的头结点. 对一棵二叉树前序遍历的顺序是"根结点->左结点->右结点",而中序遍历的顺序是"左结点->根节点->右结点",因此,一般的思路都是酱紫的: 前序遍历列表中,第一个数据

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

由先序遍历和中序遍历序列可唯一还原出二叉树,前提条件是所有节点的关键字无重复. 题目来源: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