根据前序遍历和中序遍历构建二叉树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fenghen777/article/details/47294253

问: 一颗二叉树前序遍历为{1,2,4,7,3,5,6,8},中序遍历为 {4,7,2,1,5,3,8,6},构建这只二叉树。

思路:根节点为1,根据中序遍历左边为4,7,2,右边为5,3,8,6。可以写一个递归函数来搞。

传入参数分别为:前序开始,前序结束,后序开始,后序结束


struct BinaryTreeNode 
{
    int m_value;
    BinaryTreeNode* m_pLeftNode;
    BinaryTreeNode* m_pRightNode;
};
BinaryTreeNode* ConstructCore(int* startPrerder, int* endPreorder,int* startInorder,int* endInorder)
{
    //构建根节点
    int rootValue = startPrerder[0];
    BinaryTreeNode *rootNode = new BinaryTreeNode();
    rootNode->m_value = rootValue;
    rootNode->m_pLeftNode = NULL;
    rootNode->m_pRightNode = NULL;
    if(startPrerder == endPreorder)
    {
        if(startInorder == endInorder && *startPrerder == *startInorder)
        {
            return rootNode;
        }
        else
        {
            throw std::exception("invalid paragram");
        }
    }
    int* rootInorder = startInorder;
    //找到根节点在中序的位置
    while(*rootInorder != rootValue && rootInorder <= endInorder)
    {
        rootInorder++;
    }
    if(rootInorder == endInorder && *rootInorder != rootValue)
    {
        throw std::exception("invalid paragram");
    }
    //求出左节点的个数
    int leftLength = rootInorder - startInorder;
    //求出新的前序遍历末节点位置,递归调用
    int* leftPreorderEnd = startPrerder + leftLength;
    if(leftLength > 0)
    {
        rootNode->m_pLeftNode = ConstructCore(startPrerder + 1,leftPreorderEnd, startInorder,rootInorder -1);

    if(leftLength < endPreorder - startPrerder)
    {
        rootNode->m_pRightNode = ConstructCore(leftPreorderEnd + 1,endPreorder,rootInorder+1,endInorder);
    }

    return rootNode;
}
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页