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)")