文章目录

1.什么是二叉树?

2.二叉树如何遍历?

3.二叉树如何使用?

前言:本人实际开发中用到的二叉树的场景很少,但为啥还是要学习二叉树呢?
答:本人开发经验只有几年时间,经验不是很丰富,没怎么在实际场景用过二叉树的开发,更多的是在刷leecode时,会频繁遇到二叉树的题目。但我知道,随着不断的深入学习,以后接触到一些底层原理时,肯定离不开数据结构和算法,学习二叉树也是为了以后自己能迈向更高的台阶做铺垫。这里我用go语言作为例子讲解(目前我只掌握了php和go,php实现没那么方便,所以用go),其他语言的的实现也类似,只是基本的数据类似不同而已。

PS:有时候也能刚好用数据结构和算法去更好的理解一些东西.比如php的sort函数的排序,点进去看其实底层的c代码是通过快速排序和插入排序互相结合,去给传入的数组进行排序的。当数组元素超过16个时使用快速排序(时间复杂度是n*logN的排序),小于等于16个时使用插入排序(时间复杂度是n2的排序),去实现最快的效率进行排序。还有mysql的索引是多路平衡树结构实现的,对树结构有基本概念,理解mysql索引时也能更加深入。

好了废话少说直接进入正题。

1.什么是二叉树?
二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。
直接上图就好理解了
image.png

就类似上图结构的一种数据结果,就是二叉树,用代码实现就是
二叉树节点结构

//定义二叉树节点
type Node struct {
    data  int //data结构体的字段名 类型是int 可以这样访问Node.data = 2
    left  *Node // left结构体的字段名 类型是Node指针
    right *Node // right结构体的字段名 类型是Node指针
}

例子:

package main

func main() {

    //初始化
    node1 := Node{1, nil, nil}
    node2 := Node{2, nil, nil}
    node3 := Node{3, nil, nil}

    node1.left = &node2
    node1.right = &node3

    //node1就是根结点,节点值是1,node2就是左结点,节点值是2,node3就是右结点,节点值是3,
    
}

2.二叉树如何遍历?

有先序遍历(先遍历头节点,再遍历左节点,再遍历右节点,通俗来说顺序就是:头左右),中序遍历(顺序:左头右),后序遍历(顺序:左右头).

举例下图这么一颗二叉树
image.png
则顺序为
image.png

代码实现为:

package main

import "fmt"

func main() {

    //初始化
    node1 := Node{1, nil,nil}
    node2 := Node{2, nil,nil}
    node3 := Node{3, nil,nil}
    node4 := Node{4, nil,nil}
    node5 := Node{5, nil,nil}
    node6 := Node{6, nil,nil}
    node7 := Node{7, nil,nil}

    node1.left = &node2
    node1.right = &node3


    node2.left = &node4
    node2.right = &node5

    node3.left = &node6
    node3.right = &node7

    Order(&node1)
}

//定义二叉树节点
type Node struct {
    data int
    left *Node
    right *Node
}

//递归方式
func Order(head *Node) {
    if head == nil {
        return
    }

    //fmt.Println(head.data) 先序遍历 1245367

    Order(head.left)

    //fmt.Println(head.data) //中序遍历 4251637

    Order(head.right)

    fmt.Println(head.data) //后序遍历 4526731
}

3.二叉树有什么类型呢?

有4种类型
1.搜索二叉树
2.完全二叉树
3.满二叉树
4.平衡二叉树

//篇幅太长不好,留着下一篇文章讲解。

希望能对大家学习二叉树有一点帮助。


夜雨闻铃
50 声望12 粉丝

分享和记录自己成长之路遇到学习到的经验和遇到的坑(偏php和go)。为了更好更活跃的社区,尽一份自己的微薄之力。