前序遍历和中序遍历重建二叉树

来源:互联网 发布:linux jdk配置 编辑:程序博客网 时间:2024/05/16 09:29

原理

在二叉树中,前序遍历的第一个结点是根节点,但在中序遍历序列中,根结点在序列中间,跟结点的左边是左子树,根结点的右边是右子树。因此,保存前序遍历的序列中的第一个结点为新建二叉树的根结点,遍历中序遍历序列,寻找该根结点。就可以重建二叉树了!

实现代码

//由前序遍历和中序遍历重建二叉树(前序序列: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;elsereturn 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);}


阅读全文
0 0