C++实现二叉树遍历序列的求解方法
本文详细讲述了C++实现二叉树遍历序列的求解方法,对于数据结构与算法的学习有着很好的参考借鉴价值。具体分析如下:
一、由遍历序列构造二叉树
如上图所示为一个二叉树,可知它的遍历序列分别为:
先序遍历:ABDECFG
中序遍历:DBEAFCG
后序遍历:DEBFGCA
我们需要知道的是,由二叉树的先序序列和中序序列可以唯一地确定一棵二叉树;由二叉树的后序序列和中序序列也可以唯一地确定一棵二叉树;但是如果只知道先序序列和后序序列,则无法唯一确定一棵二叉树。
二、已知二叉树的先序序列和中序序列,求后序序列。
因为由二叉树的先序序列和中序序列可以唯一地确定一棵二叉树,所以进而可以唯一地确定它的后序遍历。在先序遍历序列中,第一个结点一定是二叉树的根结点,而在中序遍历中,根结点必然将中序序列分割成两个子序列,前一个子序列就是左子树的中序序列,后一个子序列就是右子树的中序序列。根据这两个子序列的长度,可以在先序序列中找到对应的左子树先序序列和右子树先序序列。而左子树先序序列的第一个结点是左子树的根结点,右子树先序序列的第一个结点是右子树的根结点。如此递归地进行下去,便能唯一地确定这棵二叉树。
C++实现代码如下:
/************************************************************************* > File Name: Test.cpp > Author: SongLee ************************************************************************/ #include<iostream> using namespace std; struct TreeNode { struct TreeNode* left; struct TreeNode* right; char elem; }; TreeNode* PostOrderFromOrderings(char* inorder, char* preorder, int length) { if(length == 0) { return NULL; } TreeNode* node = new TreeNode; node->elem = *preorder; int rootIndex = 0; for(; rootIndex < length; rootIndex++) // 求左子树的长度 { if(inorder[rootIndex] == *preorder) break; } node->left = PostOrderFromOrderings(inorder, preorder + 1, rootIndex); node->right = PostOrderFromOrderings(inorder + rootIndex + 1, preorder + rootIndex + 1, length - (rootIndex + 1)); cout << node->elem << " "; // 求后序序列,所以最后输出根结点 return node; } int main() { char* pre = "ABDECFG"; char* in = "DBEAFCG"; PostOrderFromOrderings(in, pre, 7); cout << endl; return 0; }
三、已知二叉树的后序序列和中序序列,求先序序列。
同理,由二叉树的后序序列和中序序列也可以唯一地确定一棵二叉树,所以进而可以唯一地确定先序遍历序列。因为后序序列的最后一个结点就如同先序序列的第一个结点,可以将中序序列分割成两个子序列,然后采用类似的方法递归地进行划分。
C++实现代码如下:
/************************************************************************* > File Name: Test1.cpp > Author: SongLee ************************************************************************/ #include<iostream> using namespace std; struct TreeNode { struct TreeNode* left; struct TreeNode* right; char elem; }; TreeNode* PreOrderFromOrderings(char* inorder, char* postorder, int length) { if(length == 0) { return NULL; } TreeNode* node = new TreeNode; node->elem = postorder[length-1]; int rootIndex = 0; for(; rootIndex < length; rootIndex++) // 求左子树的长度 { if(inorder[rootIndex] == postorder[length-1]) break; } cout << node->elem << " "; // 求先序序列,所以先输出根结点 node->left = PreOrderFromOrderings(inorder, postorder, rootIndex); node->right = PreOrderFromOrderings(inorder + rootIndex + 1, postorder + rootIndex, length - (rootIndex + 1)); return node; } int main() { char* post = "DEBFGCA"; char* in = "DBEAFCG"; PreOrderFromOrderings(in, post, 7); cout << endl; return 0; }
相信本文所述实例对于大家学习数据结构与算法会起到一定的帮助作用。
上一篇:VC++中HTControl控制类使用之CHTDlgBase对话框基类实例
栏 目:C语言
下一篇:C++实现闹钟程序的方法
本文标题:C++实现二叉树遍历序列的求解方法
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3514.html
您可能感兴趣的文章
- 04-02c语言没有round函数 round c语言
- 01-10深入二叉树两个结点的最低共同父结点的详解
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10使用OpenGL实现3D立体显示的程序代码
- 01-10深入理解C++中常见的关键字含义
- 01-10求斐波那契(Fibonacci)数列通项的七种实现方法
- 01-10C语言 解决不用+、-、&#215;、&#247;数字运算符做加法
- 01-10使用C++实现全排列算法的方法详解
- 01-10c++中inline的用法分析
- 01-10深入理解二叉树的非递归遍历
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 01-10SublimeText编译C开发环境设置
- 08-05DEDE织梦data目录下的sessions文件夹有什
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结
- 01-10delphi制作wav文件的方法
- 04-02jquery与jsp,用jquery