二叉树——重建二叉树

来源:互联网 发布:手机淘宝宝贝详情编辑 编辑:程序博客网 时间: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
原创粉丝点击