根据前序和中序序列生成二叉树

2016-01-29 12:15 78 1 收藏

根据前序和中序序列生成二叉树,根据前序和中序序列生成二叉树

【 tulaoshi.com - C语言心得技巧 】

根据前序和中序序列生成二叉树
作者:宋科
作者主页:kesongemini.diy.163.com

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com) 下载本文示例代码

一、前言:
我的一个同事拿来她老公的远程教育的考试题,叫大家帮着做,我写了这道,源码通过VC6编译链接,执行成功,呵呵;)题目就是给出了一个二叉树的前序序列(ABDCEGF)和中序序列(DBAEGCF),要求根据这两个输入完成一个二叉树,但没有指定用什么方式,所以我用了最笨拙的顺序存储二叉树,不过用了map来保存二叉树。题目还要求形成二叉树后可以遍历这个二叉树,由于三种遍历只是顺序不同,所以我只实现了后序遍历,何况输入就是前序和中序。;)本来应该用template做的,不过同事要求不要用复杂的C++语法,以免姐夫难以应对老师的提问,所以我只用了string来保存数据。本人是数学系毕业的,数据结构当时开课只学了几章,所以请朋友们不要笑话我。: 我想这个程序唯一能够对您有帮助的地方就是提醒您不要将递归的函数做成inline的,希望大家干活儿的时候多注意这点儿。非常渴望朋友们和我联系email,批评我,让我进步,谢谢。:

二、代码实现:
// BTree3.cpp : Defines the entry point for the console application.//// AUTHOR:  Song Ke// EMAIL: kesongemini@vip.163.com// HOMEPAGE: http://kesongemini.diy.163.com// QQ: 123588179// COMPANY: www.etonglian.com// AIM: programmed by SongKe 2002/12/16 night at home //for Sister An Ning''s her husband''s exam-3://known as preorder(ABDCEGF) and inorder(DBAEGCF) sequence//to request for the btree and postorder sequence// STATUS: finished!// METHOD: the binary tree SongKe_BinaryTree with ordinal saving// TEST: succeeded by compile and link// PLATFORM: VC++6.0 + sp5 //MS-STL NOT SGI-STL!//at Windows2000 + sp3 // NOTE: DON''T WRITE THE RECURSION FUNCTION AS INLINE FUNCTION!#include "stdafx.h"#include <vector>#include <string>#include <iostream>#include <utility>#include <map>#include <algorithm>using namespace std;class SongKe_BinaryTree{public:SongKe_BinaryTree() : _i_generate(0) {}~SongKe_BinaryTree() {}void pre_insert(const string& s) { _pre.push_back(s); }void in_insert(const string& s) { _in.push_back(s); }void pre_out(){ _out("PREORDER : ", _pre); }void in_out(){ _out("INORDER : ", _in); }void post_out();// generate the binary treevoid generate();private:// get left or right subtree for iterationvoid _get_subtree(int iNode, vector< pair<string, int> >& v);void _get_subtree(bool bLeft, int iNode, vector< pair<string, int> >& v);void _postorder_iterate(const vector< pair<string, int> >& v);// postorder iteratevoid _inorder_iterate(const vector< pair<string, int> >& v);// using postorder iteratevoid _preorder_iterate(const vector< pair<string, int> >& v);// using postorder iterateint _i_generate; // point to current element of preorder// mark the elements in inorders, and recurse the func in.// bLeft == true or false is rightvoid _kesongemini(bool bLeft, int iNode, const vector<string>& v);void _kesongemini(const string& node, int jj, bool bLeft, int iNode, const vector<string>& v);// print outvoid _out(const string& explain, const vector<string>& vec);vector<string> _pre; // preorder sequence as knownvector<string> _in; // inorder sequence as knownvector<string> _post; // postorder sequence as requestvector< pair<string, int> > _s; // string, position as ordinal savingmap<int, string> _sm; // assistant for making subtree when postorder iteratevector<int> _si; // assistant for making subtree when postorder iterate};void SongKe_BinaryTree::_out(const string& explain, const vector<string>& vec){cout << explain << "t";for(vector<string>::const_iterator i = vec.begin(); i != vec.end(); ++i){cout << *i << " ";}cout << endl;}void SongKe_BinaryTr
                        

来源:http://www.tulaoshi.com/n/20160129/1485256.html

延伸阅读
Word-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">#include stdio.h #include stdlib.h #define STACK_MAX_SIZE 30 #define QUEUE_MAX_SIZE 30 #ifndef elemType  typedef char elemType; #endif /***********************************************************************...
树 因为现实世界中存在这“树”这种结构——族谱、等级制度、目录分类等等,而为了研究这类问题,必须能够将树储存,而如何储存将取决于所需要的操作。这里有个问题,是否答应存在空树。 !-- frame contents -- !-- /frame contents -- 有些书认为树都是非空的,因为树表示的是一种现实结构,而0不是自然数;我用过的...
才刚开了个头,就要说再见了——在树这里,除了二叉树,别的都还没有讲。为什么可以总结了呢?因为前面已经涉及到了树的两个基本用途,而假如再讲B+、B-,就不能不提到搜索,假如是胜者树就不能不提到排序。为此,把这部分放到后面。 !-- frame contents -- !-- /frame contents -- 我前面所做的努力,只是让你有个基本概念,什么...
一棵二叉查找树是按二叉树结构来组织的。这样的树可以用链表结构表示,其中每一个结点都是一个对象。结点中除了数据外,还包括域left,right和p,它们分别指向结点的左儿子、右儿子,如果结点不存在,则为NULL。 它或者是一棵空树;或者是具有下列性质的二叉树: 1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树...
本课主题: 实验七 查找 教学目的: 练习顺序查找、折半查找及二叉排序树的实现 教学重点: 教学难点: 授课内容: 顺序查找 折半查找 顺序查找及折半查找示例 二叉排序树 示例

经验教程

22

收藏

73
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部