3.9 重建二叉树

题目:给定一颗树的先序遍历结果和中序遍历的结果,重建这颗树。

例如:

前序:a b d c e f

中序:d b a e c f

a是根节点。

思路:根据前序,可以很快找出根节点a,然后根据中序,可以找出根节点a的左右子树,然后递归求a的左子树前序b d跟中序d b,a的右子树前序c e f跟中序e c f即可


代码:

struct pNode {
    pNode *pLeft;
    pNode *pRight;
    char ch;
};

void reBuild(char *pPreOrder, char *pInOrder, int treeLength, pNode **pRoot) {
    if(pPreOrder == NULL || pInOrder == NULL) return ;   //检查边界条件
    pNode *pTemp = new pNode;       //获得前序遍历的第一个节点
    pTemp->pLeft = NULL;
    pTemp->pRight = NULL;
    pTemp->ch = *pPreOrder;
    if(*pRoot == NULL) *pRoot = pTemp;  //如果节点为空,把当前节点复制到根节点
    if(treeLength == 1) return ;    //如果当前树的长度是1,那么已经是最后一个节点了
    char *pLeftEnd = pInOrder;     //用来寻找左子树的长度
    
    int nTempLen = 0;
    while(*pLeftEnd != *pPreOrder) {    //利用中序遍历的结果来找到左子树的结尾
        if(pLeftEnd == NULL || pPreOrder == NULL) return ;
        nTempLen++;
        if(nTempLen > treeLength) break;   //记录临时长度,以免溢出
        pLeftEnd++;
    }
    int nLeftLen = (int)(pLeftEnd - pInOrder);  //记录左子树的长度
    
    int nRightLen = treeLength - nLeftLen - 1;  //记录右子树的长度
    
    if(nLeftLen > 0) {      //重建左子树
        reBuild(pPreOrder+1, pInOrder, nLeftLen, &((*pRoot)->pLeft));
    }
    if(nRightLen > 0) {     //重建右子树
        reBuild(pPreOrder+nLeftLen+1, pInOrder+nLeftLen+1, nRightLen, &((*pRoot)->pRight));
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值