由前序遍历和中序遍历重构二叉树
2017-07-31 23:42
218 查看
由前序遍历和中序遍历重建二叉树
前序序列(根-左-右):1 2 3 4 5 6
中序序列(左-根-右):3 2 4 1 6 5
1、由前序遍历可知根节点为第一个元素1,在中序遍历序列中找到1对应位置,则1的左边就是左子树3 2 4,右边就是右子树6 5;2、在找到前序遍历序列中从第二个位置开始往后找相同数目的节点为左子树2 3 4,剩余的就是右子树序列6 5;
3、根据前序遍历规则可知,左子树序列里第一个就是左子树的根节点2,右子树序列里的第一个就是有右子树的根节点5;
4、根据中序遍历序列可知,左子树的根节点2左边的一定是以其为根节点的左子树序列3,右边就是以其为根节点的右子树序列4,右子树的根节点5左边的一定是以其为根节点的右子树序列6
struct BinaryTreeNode { int _data; BinaryTreeNode * _pLeftChild; BinaryTreeNode* _pRighChild; }; BinaryTreeNode* RebuildBinaryTree(int* PreOder, int*InOrder, int length) { if (PreOder == NULL || InOrder == NULL || length <= 0) return NULL; _RebuildBinaryTree(PreOder, PreOder + length - 1, InOrder, InOrder + length - 1); } BinaryTreeNode* _RebuildBinaryTree(int* startPre, int* endPre, int* startIn, int* endIn) { //根据前序遍历保存根节点 BinaryTreeNode *pRoot; pRoot = new BinaryTreeNode(); pRoot->_data = startPre[0]; pRoot->_pLeftChild = NULL; pRoot->_pRighChild = NULL; //判断是否找完了此次中序遍历,若是找完了,则返回pRoot; if (startIn == endIn&&*startIn == *endIn) return pRoot; //在中序遍历中找根节点所在的位置 int* pRootIn = startIn; while (*startPre != *pRootIn) pRootIn++; //根据根节点在中遍历中的位置,递归还原左子树 int leftlen = pRootIn - startIn; if (leftlen > 0) { pRoot->_pLeftChild = _RebuildBinaryTree(startPre + 1, startPre + leftlen, startIn, startIn + leftLen); } //左子树长度加上中序的起始位置后若仍小于整个中序长度,则说明该节点右子树存在,递归还原右子树 if (leftlen + startIn < endIn) { pRoot->_pRighChild = _RebuildBinaryTree(startPre+leftlen+1,endPre,startIn+leftlen+1,endIn); } return pRoot; }
相关文章推荐
- 根据前序遍历和中序遍历重构二叉树
- 知道二叉树的前序遍历和中序遍历重构二叉树
- 根据二叉树的前序遍历和中序遍历,重构二叉树
- 二叉树根据前序遍历和中序遍历重构确定唯一二叉树
- 从二叉树的前序遍历序列和中序遍历序列重构出二叉树
- 根据二叉树的前序遍历和中序遍历,重构出二叉树
- 3.9已知二叉树的 前序遍历和中序遍历的结果,重构出原二叉树
- 由前序遍历和中序遍历重建二叉树
- 前序遍历和中序遍历序列能确定唯一的一棵二叉树
- 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
- 阿里笔试-二叉树由前序遍历和中序遍历推导后序遍历
- 已知二叉树的前序遍历和中序遍历的结果,重建二叉树
- 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5
- 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
- 由前序遍历和中序遍历重建二叉树
- 由前序遍历和中序遍历重建二叉树
- 由前序遍历和中序遍历重建二叉树
- 前序遍历和中序遍历重建二叉树
- 二叉树已知前序遍历和中序遍历,编程求后序遍历。
- 计算机技术——已知二叉树的前序遍历和中序遍历,如何得到它的后序遍历?