ios中知道前序和中序,求后序遍历算法

在网上找了一通,没找到相关的iOS这边的实现,于是自己写了一个,有很大的优化空间,但是很容易理解。简单试了一下好像问题不大


- (NSArray*)sortTree:(NSArray*)frontArrand:(NSArray*)midArr{

    if(frontArr.count!= midArr.count|| frontArr.count==0) {

        returnnil;

    }

    //拿到root节点。

    NSString*rootPoint = frontArr[0];

    //通过root节点和中序遍历结果,切割出中序遍历左右子树。(不含root节点)

    NSMutableArray *midLeftArr = [NSMutableArray array];

    NSMutableArray *midRightArr = [NSMutableArray array];

    intaNum = (int)[midArrindexOfObject:rootPoint];

    for(inti =0; i < midArr.count; i ++) {

        if(i < aNum) {

            [midLeftArraddObject:midArr[i]];

        }

        elseif(i > aNum) {

            [midRightArraddObject:midArr[i]];

        }

    }

    //这里通过上面求出来左右子树的节点数,划分出前序遍历的左右子树。

    NSArray*frontLeftArr = [frontArrsubarrayWithRange:NSMakeRange(1, midLeftArr.count)];

    NSArray*frontRightArr = [frontArrsubarrayWithRange:NSMakeRange(1+ midLeftArr.count, midRightArr.count)];

    //递归求值,(把左右子树分别看作单独的二叉树进行递归)

    NSArray*lArr = [selfsortTree:frontLeftArrand:midLeftArr];

    NSArray*rArr = [selfsortTree:frontRightArrand:midRightArr];

    //我们知道了左子树和右子树还有节点,然后我们重新拼接一下就是我们需要的后序遍历了。

    NSMutableArray *sortArr = [NSMutableArray array];

    for(inti =0; i < lArr.count; i ++) {

        [sortArraddObject:lArr[i]];

    }

    for(inti =0; i < rArr.count; i ++) {

        [sortArraddObject:rArr[i]];

    }

    //别忘了root节点跟在最后面

    [sortArraddObject:rootPoint];

    //返回结果就是了

    returnsortArr;

}

希望能帮助大家,如果有问题大家可以提出来一起讨论一下。

你可能感兴趣的:(ios中知道前序和中序,求后序遍历算法)