【编程之美】3.9重建二叉树

题目:

    给定一棵二叉树,假定每个节点都用唯一的字符表示,具体结构如下:

struct NODE {
  NODE* pLeft;
  NODE* pRight;
  char chValue;
};

    假设已经有了前序遍历和中序遍历结果,希望通过一个算法重建这棵树。
    给定函数的定义如下:

void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE** pRoot);

    参数
    pPreOrder:前序遍历结果的字符串数组。
    pInOrder: 中序遍历结果的字符串数组。
    nTreeLen: 树的长度。
    pRoot:     根据前序和中序遍历结果重新构建树的根节点。
    例如
    前序遍历结果:a b d c e f
    中序遍历结果:d b a e c f

 

思路:不难,根据前序遍历结果找跟,根据中序遍历结果划分左右子树,递归求解。

/*
start time = 15:55
end time = 16:23
*/
#include<iostream>
using namespace std;

typedef struct NODE{
    NODE *pLeft, *pRight;
    char chValue;
}NODE;

void Rebuild(char* pPreOrder, char* pInOrder, int nTreeLen, NODE** pRoot)
{
    if(pPreOrder == NULL || pInOrder == NULL) //边界条件不要忘了 这是看答案后补上的
    {
        return;
    }
    if(nTreeLen <= 0)
    {
        return;
    }
    //重建根节点 一定是先序遍历的第一个值
    *pRoot = new NODE;
    (*pRoot)->chValue = pPreOrder[0];
    (*pRoot)->pLeft = NULL;
    (*pRoot)->pRight = NULL;

    //查找根在中序遍历中的位置,把中序遍历表转化为左子树和右子树两个部分
    int iLocateRoot;
    for(iLocateRoot = 0; iLocateRoot < nTreeLen; iLocateRoot++)
    {
        if(pInOrder[iLocateRoot] == pPreOrder[0])
        {
            break;
        }
    }

    //重建左子树
    Rebuild(pPreOrder+1, pInOrder, iLocateRoot, &((*pRoot)->pLeft));
    //重建右子树
    Rebuild(pPreOrder+iLocateRoot+1, pInOrder + iLocateRoot + 1, nTreeLen - iLocateRoot - 1, &((*pRoot)->pRight));
}

int main()
{
    char pre[7] = {'a','b','d','c','e','f','\0'};
    char in[7] = {'d','b','a','e','c','f','\0'};
    NODE * T = NULL;
    Rebuild(pre, in, 7, &T);

    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值