方式
概念
- 前序遍历:递归遍历根->左->右
- 中序遍历:递归遍历左->根->右
- 后续遍历:递归遍历左->右->中
- 层序遍历:由根节点开始一层层的遍历
其实前序遍历、中序遍历、后序遍历里面的前、中、后指的是根结点的位置。以下面这棵树来举例说明。
存储结构
1 2 3 4 5
| type Node struct { Value string Left *Node Right *Node }
|
前序遍历
前序遍历要求先遍历根节点,然后遍历左子树,左后便利右子树。注意这里指的是【子树】不是孩子。所以遍历顺序为:
A,B,D,H,I,E,J,C,F,K,G
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| func PreRange(node *Node) []string { if node == nil { return nil } list := make([]string, 0) list = append(list, node.Value)
leftList := PreRange(node.Left) if leftList != nil { list = append(list, leftList...) } rightList := PreRange(node.Right) if rightList != nil { list = append(list, rightList...) }
return list }
|
中序遍历
中序遍历要求先遍历左子树,然后遍历根节点,最后遍历右子树。所以顺序为:
H,D,I,B,E,J,A,F,K,C,G
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| func MidRange(node *Node) []string { if node == nil { return nil } list := make([]string,0) leftList := MidRange(node.Left) if leftList != nil { list = append(list, leftList...) } list = append(list, node.Value) rightList := MidRange(node.Right) if rightList != nil { list = append(list, rightList...) }
return list }
|
后续遍历
后序遍历要求先遍历左子树,然后遍历右子树,最后遍历根节点。所以顺序为:
H,I,D,J,E,B,K,F,G,C,A
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| func SufRange(node *Node) []string { if node == nil { return nil } list := make([]string,0) leftList := SufRange(node.Left) if leftList != nil { list = append(list, leftList...) } rightList := SufRange(node.Right) if rightList != nil { list = append(list, rightList...) } list = append(list, node.Value)
return list }
|
层序遍历
层序遍历其实就是从根节点开始从左到右一层层开始遍历所有节点, 所以顺序为:
A,B,C,D,E,F,G,H,I,J,K
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
| func LevelTraversal(node *Node) []string { if node == nil { return nil }
nodeList := make([]*Node, 0) nodeList = append(nodeList, node)
return RecursionTraversal(nodeList) }
func RecursionTraversal(nodeList []*Node) []string { if len(nodeList) == 0 { return nil }
list := make([]string,0) nextNodeList := make([]*Node, 0) for _, node := range nodeList { list = append(list, node.Value)
if node.Left != nil { nextNodeList = append(nextNodeList, node.Left) }
if node.Right != nil { nextNodeList =append(nextNodeList, node.Right) } }
if len(nextNodeList) > 0 { s := RecursionTraversal(nextNodeList) if len(s) > 0 { list = append(list, s...) } }
return list }
|