前序遍历和中序遍历重建二叉树
2017-07-30 21:18
651 查看
原理
在二叉树中,前序遍历的第一个结点是根节点,但在中序遍历序列中,根结点在序列中间,跟结点的左边是左子树,根结点的右边是右子树。因此,保存前序遍历的序列中的第一个结点为新建二叉树的根结点,遍历中序遍历序列,寻找该根结点。就可以重建二叉树了!实现代码
//由前序遍历和中序遍历重建二叉树(前序序列:1 2 3 4 5 6 - 中序序列:3 2 4 1 6 5) BinaryNode* ConstructTreeCode(int* startPreorder, int* endProrder, int* startInorder, int* endInorder) { BinaryNode *pRoot = new BinaryNode(startPreorder[0]);//前序遍历的第一个节点就是根节点 pRoot->_left = pRoot->_right = NULL; //只有一个节点或只剩下一个节点 if (startPreorder == endProrder) { if (startInorder == endInorder && *startPreorder == *startInorder) return pRoot; else return NULL; } //在中序遍历中找根节点 int* InorderRoot = startInorder; while (InorderRoot <= endInorder && *InorderRoot != pRoot->_value) InorderRoot++; if (InorderRoot == endInorder && *InorderRoot != pRoot->_value)//没找到 return NULL; //找到了 int leftlength = InorderRoot - startInorder; int* leftPreorderend = startPreorder + leftlength; if (leftlength > 0) pRoot->_left = ConstructTreeCode(startPreorder + 1, leftPreorderend, startInorder, InorderRoot - 1); if (leftlength < endProrder-startPreorder) pRoot->_right = ConstructTreeCode(leftPreorderend + 1, endProrder, InorderRoot + 1, endInorder); return pRoot; } BinaryNode* ConstructTree(int* Preorder, int* Inorder, int length) { if (Preorder == NULL && Inorder == NULL && length <= 0) return NULL; return ConstructTreeCode(Preorder, Preorder + length - 1, Inorder, Inorder + length - 1); } void Preorder(BinaryNode* root) { if (root == NULL) return; cout << root->_value << " "; Preorder(root->_left); Preorder(root->_right); } void FunTest4() { int array1[6] = { 1, 2, 3, 4, 5, 6 }; int array2[6] = { 3, 2, 4, 1, 6, 5 }; BinaryNode* pRoot = ConstructTree(array1, array2, 6); Preorder(pRoot); }
相关文章推荐
- 输入某二叉树的前序遍历和中序遍历的结果,重建此二叉树。
- 二叉树(14)----由前序遍历和中序遍历重建二叉树,递归方式
- 《剑指Offer》 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
- 由前序遍历和中序遍历重建二叉树
- 根据二叉树的前序遍历和中序遍历重建二叉树
- 由前序遍历和中序遍历重建二叉树
- 根据前序遍历和中序遍历重建二叉树
- 输入某二叉树的前序遍历和中序遍历的结果,重建该二叉树
- 如何根据前序遍历和中序遍历重建二叉树
- 由前序遍历和中序遍历重建二叉树
- 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树
- 已知二叉树的前序遍历和中序遍历的结果,重建二叉树
- 根据二叉树的前序遍历和中序遍历的结果,重建二叉树
- java 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
- 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5
- 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。
- 根据二叉树的前序遍历和中序遍历的结果重建出该二叉树
- 题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,
- 一直二叉树的前序遍历和中序遍历的结果,重建该二叉树 Java代码实现
- 由前序遍历数组和中序遍历数组重建二叉树