根据二叉树的前序+中序遍历,输出其后续遍历

31 阅读1分钟
func generaTree(preOrder:[Int],midOrder:[Int])->TreeNode? {

    guard preOrder.count == midOrder.count else {
        return nil
    }
    
    guard let rootVal = preOrder.first else {
        return nil
    }
    
    guard let rootIndexInMid = midOrder.firstIndex(of: rootVal) else {
        return nil
    }
    print("======preOrder:\(preOrder),midOrder:\(midOrder)")
    
    var root:TreeNode = TreeNode(val: rootVal)
    var midLeft:[Int] = []
    var midRight:[Int] = []
    var preLeft:[Int] = []
    var preRight:[Int] = []
    if rootIndexInMid>0{
        midLeft = Array(midOrder[0..<rootIndexInMid])
    }

    if rootIndexInMid<midOrder.count-1{
        midRight = Array(midOrder[rootIndexInMid+1..<midOrder.count])
    }
    
    preLeft = Array(preOrder[1..<midLeft.count+1])
    preRight = Array(preOrder[midLeft.count+1..<midOrder.count])
    print("nodeValue:\(rootVal),midLeft:\(midLeft),midRight:\(midRight),preLeft:\(preLeft),preRight:\(preRight),rootIndexInMid:\(rootIndexInMid)")
    root.left = generaTree(preOrder: preLeft, midOrder: midLeft)
    root.right = generaTree(preOrder: preRight, midOrder: midRight)
    return root
}

let preOrder:[Int] = [1,2,4,5,6,9,32]
let midOrder:[Int] = [4,2,5,1,9,6,32]
var lastOrder:[Int] = []  
func lastOrderTraverse(root:TreeNode?) {
    guard let root = root else {
        return
    }
    lastOrderTraverse(root: root.left)
    lastOrderTraverse(root: root.right)
    lastOrder.append(root.val)
}

let treeRoot = generaTree(preOrder: preOrder, midOrder: midOrder)
lastOrderTraverse(root: treeRoot)
print("lastOrder:\(lastOrder)")