美文网首页
ios中知道前序和中序,求后序遍历算法

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

作者: mr_ios_zhang | 来源:发表于2020-08-13 17:02 被阅读0次

    在网上找了一通,没找到相关的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中知道前序和中序,求后序遍历算法

          本文链接:https://www.haomeiwen.com/subject/akkidktx.html