我是为了练习方便,先在纸上花了一个二叉搜索树(满的二叉树)。

反转二叉树效果如下:

dfs,讲真看过《大话数据结构》都记住了。当然这不是死记硬背的。而是去理解。
二叉搜索树的中序遍历就是1,2,3,4,5,6,7。
package main
import (
"fmt"
)
type Tree struct {
Data int
LeftNode *Tree
RightNode *Tree
}
func createTree()*Tree {
var root *Tree = &Tree{4,nil,nil}
root.LeftNode = &Tree{2, nil, nil}
root.LeftNode.LeftNode = &Tree{1, nil, nil}
root.LeftNode.RightNode = &Tree{3, nil, nil}
root.RightNode = &Tree{6, nil, nil}
root.RightNode.LeftNode = &Tree{5, nil, nil}
root.RightNode.RightNode = &Tree{7, nil, nil}
return root
}
func preOrderTraverseTree(root *Tree) {
if root == nil {
return
}
fmt.Println(root.Data)
preOrderTraverseTree(root.LeftNode)
preOrderTraverseTree(root.RightNode)
}
func inOrderTraverseTree(root *Tree) {
if root == nil {
return
}
inOrderTraverseTree(root.LeftNode)
fmt.Println(root.Data)
inOrderTraverseTree(root.RightNode)
}
func postOrderTraverseTree(root *Tree) {
if root == nil {
return
}
postOrderTraverseTree(root.LeftNode)
postOrderTraverseTree(root.RightNode)
fmt.Println(root.Data)
}
func bfs(root *Tree) {
if root == nil {
return
}
// for root 需要借助队列
var queue []*Tree
queue = append(queue, root)
for len(queue) > 0 {
node := queue[0]
fmt.Println(node.Data)
if node.LeftNode != nil {
queue = append(queue, node.LeftNode)
}
if node.RightNode != nil {
queue = append(queue, node.RightNode)
}
queue = queue[1:] // 通过这样的方式达到出队列
}
}
func dfsInverseTree(root *Tree) {
if root == nil {
return
}
// 交换左右子树
tempNode := root.LeftNode
root.LeftNode = root.RightNode
root.RightNode = tempNode
dfsInverseTree(root.LeftNode)
// fmt.Println(root.Data)
dfsInverseTree(root.RightNode)
}
func bfsInverseTree(root *Tree) {
if root == nil {
return
}
// for root 需要借助队列
var queue []*Tree
queue = append(queue, root)
for len(queue) > 0 {
node := queue[0]
// fmt.Println(node.Data)
// 交换左右子树
tempNode := node.LeftNode
node.LeftNode = node.RightNode
node.RightNode = tempNode
if node.LeftNode != nil {
queue = append(queue, node.LeftNode)
}
if node.RightNode != nil {
queue = append(queue, node.RightNode)
}
queue = queue[1:] // 通过这样的方式达到出队列
}
}
func main() {
root := createTree()
fmt.Println("pre-------")
preOrderTraverseTree(root)
fmt.Println("in-------")
inOrderTraverseTree(root)
fmt.Println("post------")
postOrderTraverseTree(root)
fmt.Println("bfs------")
bfs(root)
fmt.Println("defInverseTree-----")
dfsInverseTree(root)
fmt.Println("inorder-----")
inOrderTraverseTree(root)
fmt.Println("bfsInverseTree------")
bfsInverseTree(root)
fmt.Println("inorder---------")
inOrderTraverseTree(root)
}
层次遍历
func levelTraverseTree(root *Tree) [][]*Tree {
if root == nil {
return [][]*Tree{}
}
var arr[][]*Tree
var oneArr[]*Tree
var tempArr[]*Tree
oneArr = append(oneArr,root)
arr = append(arr, oneArr)
for i:=0;i<len(oneArr);{
node := oneArr[i]
if node.LeftNode != nil {
tempArr = append(tempArr, node.LeftNode)
}
if node.RightNode !=nil {
tempArr = append(tempArr, node.RightNode)
}
if (i == len(oneArr)-1 && len(tempArr)>0) {
oneArr = tempArr
arr = append(arr, tempArr)
tempArr = []*Tree{}
i =0
continue
}
i++
}
return arr
}
然后我们打印下
func main() {
root := createTree()
arr := levelTraverseTree(root)
l := len(arr)
for i:= 0; i<l; i++ {
l2 := len(arr[i])
fmt.Print("[")
for j:=0;j<l2;j++ {
fmt.Print(arr[i][j].Data)
}
fmt.Print("]\n")
}
}
效果如下
[4]
[26]
[1357]
参考资料:
- 《大话数据结构》
- 《数据结构与算法之美》极客专栏
- 《算法面试通关40讲》极客专栏
网友评论