二叉树——重建二叉树
来源:互联网 发布:手机淘宝宝贝详情编辑 编辑:程序博客网 时间:2024/06/06 01:15
问题:给定二叉树的前序遍历结果和中序遍历结果,恢复出原二叉树。假设二叉树中的元素都不重复,给定二叉树的前序遍历序列{1,2,4,7,3,5,6,8},二叉树的中序遍历序列{4,7,2,1,5,3,8,6}。
看到此题,我首先想到的是寻找根节点,由前序遍历序列可以看出根节点为1,此时通过中序遍历可以看出来4,7,2在根节点的左子树,5,3,8,6在树的右节点。此时我们可以发现序列中每一段都是符合前序或中序遍历的,所以我们可以使用递归解决这个问题,下面我给出这个题的解决思路。
1、寻找中序遍历序列根节点的位置,将根节点前后分成两部分
2、统计根节点前面元素的长度,从而将前序遍历序列不含根节点的部分也分成了两部分
3、将前序、中序遍历中分成的两部分递归,从而恢复出原二叉树
下面给出完整代码
struct BinaryTreeNode{ int _value; BinaryTreeNode* _left; BinaryTreeNode* _right; BinaryTreeNode(int value) : _value(value) , _left(NULL) , _right(NULL) {}};typedef BinaryTreeNode Node;Node* Construct(int *PreOrder, int* InOrder, int length){ if (PreOrder == NULL || InOrder == NULL || length == 0) { return NULL; } return ConstructCore(PreOrder, PreOrder + length-1, InOrder, InOrder + length-1);}Node* ConstructCore(int* startPreOrder, int* endPreOrder, int* startInOrder, int* endInOrder){ int rootValue = startPreOrder[0]; Node* root = new Node(rootValue); if (startPreOrder == endPreOrder) { if (startInOrder == endInOrder && *startPreOrder == *startInOrder) { return root; } else { cout << "error INPUT" << endl; return NULL; } } //在中序遍历寻找根节点的值 int* rootInorder = startInOrder; while (*rootInorder != rootValue && rootInorder < endInOrder) { ++rootInorder; } if (rootInorder == endInOrder && *rootInorder != rootValue) { cout << "error INPUT" << endl; return NULL; } int leftlength = rootInorder - startInOrder; int* leftPreorderEnd = startPreOrder + leftlength; //构建左右子树 if (leftlength > 0) { root->_left = ConstructCore(startPreOrder + 1, leftPreorderEnd, startInOrder, rootInorder - 1); } if (leftlength < (endPreOrder - startPreOrder))//判断是否存在左子树 { root->_right = ConstructCore(leftPreorderEnd + 1, endPreOrder, rootInorder + 1, endInOrder); } return root;}
从上面的代码可以看出来,使用递归这类问题还是比较容易解决的。
0 0
- 二叉树——重建二叉树
- 树——重建二叉树
- 剑指offer——重建二叉树
- 《剑指offer》——重建二叉树
- 剑指Offer——重建二叉树
- 剑指offer——重建二叉树
- 重建二叉树——剑指offer
- 重建二叉树——递归
- 剑指offer——重建二叉树
- 剑指offer——重建二叉树
- 剑指offer——重建二叉树
- 剑指offer——重建二叉树
- 剑指offer——重建二叉树
- 剑指offer——重建二叉树
- 面试算法—重建二叉树
- 剑指offer—重建二叉树
- 《剑指offer》—4、重建二叉树
- 面试题6—重建二叉树
- js div中内容溢出时最新添加的元素可视化
- Maven使用详解
- 阿里云域名绑定动态ip解决方法
- JavaWeb项目中访问WEB-INF目录下的文件(以及项目目录问题)
- ulua使用经验
- 二叉树——重建二叉树
- Java参数引用传递之例外:null
- Toj 1188 Tian Ji -The Horse Racing
- 购物网站
- PHP面向对象(OOP)第三天
- 实战 Android中的UI过度绘制
- 设计模式(4)-行为型-观察者模式(Observer)
- NDK开发-Android Studio+gradle-experimental开发ndk
- 剑指Offer java代码