重建二叉树
来源:互联网 发布:插值法填补缺失数据 编辑:程序博客网 时间:2024/04/30 18:04
题目:给定二叉树的先序和中序遍历,构建这个二叉树。例如:先序遍历结果是:abdcef,中序遍历的结果是:dbaecf,如何构建二叉树
分析:先序遍历的结果中的每一个节点,将中序遍历的结果分为左右子树两部分,递归构建二叉树,就可以完成树得构建。
程序如下:
#include <stdio.h>#include <string>class TreeNode { public: TreeNode() : left_(NULL), right_(NULL) {} TreeNode(char value) : value_(value), left_(NULL), right_(NULL) {} char value_; TreeNode* left_; TreeNode* right_;};void BuildTree(const std::string& pre_order, size_t& offset, const std::string& in_order, int start, int end, TreeNode* &parent) { if (offset < pre_order.size() && end >= start) { parent = new TreeNode(pre_order[offset]); char tmp = pre_order[offset]; offset++; int pivot = start; while (pivot <= end) { if (in_order[pivot] != tmp) { pivot++; } else { break; } } BuildTree(pre_order, offset, in_order, start, pivot - 1, parent->left_); BuildTree(pre_order, offset, in_order, pivot + 1, end, parent->right_); } }void PreOrderVisit(TreeNode* current) { if (current) { printf("%c ", current->value_); PreOrderVisit(current->left_); PreOrderVisit(current->right_); }}void InOrderVisit(TreeNode* current) { if (current) { InOrderVisit(current->left_); printf("%c ", current->value_); InOrderVisit(current->right_); }}int main(int argc, char** argv) { std::string pre_order = "abdcef"; std::string in_order = "dbaecf"; TreeNode* tree; size_t offset = 0; BuildTree(pre_order, offset, in_order, 0, in_order.size() - 1, tree); PreOrderVisit(tree); printf("\n"); InOrderVisit(tree);}
注意:刚开始将start和end类型设置为size_t类型,程序执行总是不对,以至于快颠覆了我对递归的理解,不过跟踪调试的过程,更好的理解了递归的处理过程。因为start或end可能取值-1,而size_t是无符号的,导致判断出错,这个问题花费了一些时间来检查,下次一定注意,涉及到递归偏移量的问题,尽量使用有符号数,因为中间的过程可能出现负数。
参考文献:
编程之美3.9
- 3.9重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 二叉树的重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 二叉树重建
- 二叉树重建
- 重建二叉树
- 重建二叉树
- 重建二叉树
- 动态链接库—优点
- 设计模式
- 2012年2月21日
- Android 装载器---启动装载器
- Linux设备驱动编程之 内存与I/O操作
- 重建二叉树
- Mysql学习点滴记录(1)--》数据库和表的操作
- Android 装载器---重启装载器
- python调用Java-JPype使用介绍
- Android 装载器---使用LoaderManager的回调方法
- 组织机构对象模型设计及实现
- Android 装载器---例子
- spinlock与linux内核调度的关系
- ProgressBar 进度条颜色设置