cubegao

Swift.重建二叉树

2015-07-02

题目描述:根据二叉树的前序遍历和中序遍历的结果,重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import Foundation

class For06Solution {

func rebuildTree1(_ preOrder: [Int], _ inOrder: [Int] ) -> TreeNode? {

var p = preOrder
var i = inOrder
return recursive2(&p, &i, 0, i.count-1)

//下面是循环
var rootValue = preOrder[0]
var tree = TreeNode(rootValue)
let res = tree
var rightTree = tree


//左子树长度
var leftLen = 0
while inOrder[leftLen] != rootValue {
leftLen += 1
}

for (i , n) in preOrder.enumerated() {

var findIndex = 0

if i == 0 {
continue
}else if i <= leftLen {
findIndex = 0

while findIndex <= leftLen {
//从左向右查找,先找到根节点,说明n在右子树上
if inOrder[findIndex] == rootValue {
tree.right = TreeNode(n)
tree = tree.right!
rootValue = n
break
}else if inOrder[findIndex] == n {
tree.left = TreeNode(n)
tree = tree.left!
rootValue = n
break
}
findIndex += 1
}
}else {
findIndex = leftLen + 1
let rightLen = preOrder.count - 1

if findIndex == i {
//右子树的第一个节点
rootValue = n
}

while findIndex <= rightLen {
if inOrder[findIndex] == rootValue {
rightTree.right = TreeNode(n)
rightTree = rightTree.right!
rootValue = n
break
}else if inOrder[findIndex] == n {
rightTree.left = TreeNode(n)
rightTree = rightTree.left!
rootValue = n
break
}
findIndex += 1
}
}
}

return res
}

//不能改变输入
func recursive1(_ preOrder: inout [Int],_ startPre: Int,_ endPre: Int, _ inOrder: inout [Int],_ startIn: Int,_ endIn: Int) -> TreeNode? {

if startPre > endPre || startIn > endIn {
return nil
}

let root = TreeNode(preOrder[startPre])
print(root.val)
for index in startIn...endIn {
if inOrder[index] == root.val {
root.left = recursive1(&preOrder, startPre+1, startPre+(index-startIn), &inOrder, startIn, index-1)
root.right = recursive1(&preOrder, startPre+(index-startIn)+1, endPre, &inOrder, index+1, endIn)
break
}
}
return root
}

//能改变输入
func recursive2(_ preOrder: inout [Int], _ inOrder: inout [Int],_ startIn: Int,_ endIn: Int) -> TreeNode? {

if preOrder.count == 0 || startIn > endIn {
return nil
}

let root = TreeNode(preOrder.removeFirst())
print(root.val)
for index in startIn...endIn {
if inOrder[index] == root.val {
print("\(startIn)+++\(index)+++\(endIn)")
root.left = recursive2(&preOrder, &inOrder, startIn, index-1)
root.right = recursive2(&preOrder, &inOrder, index+1, endIn)
break
}
}
return root
}
}

算法思想:前序遍历的第一个值为根节点的值,使用这个值将中序遍历结果分成两部分,左部分为树的左子树中序遍历结果,右部分为树的右子树中序遍历的结果。然后分别对左右子树递归地求解。

github地址:https://github.com/cubegao/LeetCode

Tags: 算法

扫描二维码,分享此文章