在网上找了一通,没找到相关的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;
}
希望能帮助大家,如果有问题大家可以提出来一起讨论一下。
网友评论