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

根据给定的前序遍历{1,2,4,7,3,5,6,8}和中序遍历{4,7,2,1,5,3,8,6},通过递归函数构建二叉树。根节点为1,中序遍历中左子树包含4,7,2,右子树包含5,3,8,6。" 124683675,10272078,ES6的Set与Map对象详解及应用,"['javascript', '前端', 'typescript']

问: 一颗二叉树前序遍历为{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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值