一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情。
二叉树
子节点个数不能超过两个的的有序树,没有子节点的节点是叶子节点。
二叉树的性质
- 二叉树第i层上至多有2(i-1)个节点
- 深度为k的二叉树至多有2(k-1)个节点(k>=1)
- 对于任何一棵二叉树T,如果其终端节点树为n0,度为2的节点树为n2,则n0 = n2+1
- 具有n个节点的完全二叉树的深度为[log2n]+1
用Golang实现二叉树创建和遍历
实现上,树的每个节点是一个数据结构。包括了节点数据data,和左子节点指针、右子节点指针。首字母大写外部才可调用
type BinaryTree struct {
Data string
LNode, RNode *BinaryTree
}
神用递归,人用迭代。递归会占用多的栈空间,在日常开发中作为下下策。但二叉树的创建和遍历中却有着拍案叫绝的效果。极大的简化了代码
我们通过键盘输入,每次回车创建一个节点,遇到’表示当前节点为空节点。使用递归创建子节点。
func CreateTree(node *BinaryTree) {
var iData string
fmt.Scan(&iData)
if iData != "'" {
node.Data = iData
node.LNode = &BinaryTree{}
node.RNode = &BinaryTree{}
fmt.Println("请输入" + node.Data + "左节点值")
CreateTree(node.LNode)
fmt.Println("请输入" + node.Data + "右节点值")
CreateTree(node.RNode)
} else {
node.Data = ""
}
}
二叉树的遍历(中序遍历):
传入一颗树的根节点和层级1,因为每个节点都是最多有两个节点,相当于多个节点都在做同一件事
func PrintNode(tree *BinaryTree, level int) {
if tree.Data != "" {
fmt.Printf("值为:%s,在第%d层\n", tree.Data, level)
if tree.LNode != nil {
PrintNode(tree.LNode, level+1)
}
if tree.RNode != nil {
PrintNode(tree.RNode, level+1)
}
}
}
创建如上的一颗二叉树
运行效果:
完整的两个代码文件:
文件的层级
main.go
structpk/binaryTree.go
main.go
package main
import "baiyun/structpk"
func main() {
root := &structpk.BinaryTree{Data: "root"}
root.LNode = &structpk.BinaryTree{}
root.RNode = &structpk.BinaryTree{}
structpk.CreateTree(root)
structpk.PrintNode(root, 1)
}
structpk/binaryTree.go
package structpk
import "fmt"
type BinaryTree struct {
Data string
LNode, RNode *BinaryTree
}
func CreateTree(node *BinaryTree) {
var iData string
fmt.Scan(&iData)
if iData != "'" {
node.Data = iData
node.LNode = &BinaryTree{}
node.RNode = &BinaryTree{}
fmt.Println("请输入" + node.Data + "左节点值")
CreateTree(node.LNode)
fmt.Println("请输入" + node.Data + "右节点值")
CreateTree(node.RNode)
} else {
node.Data = ""
}
}
func PrintNode(tree *BinaryTree, level int) {
if tree.Data != "" {
fmt.Printf("值为:%s,在第%d层\n", tree.Data, level)
if tree.LNode != nil {
PrintNode(tree.LNode, level+1)
}
if tree.RNode != nil {
PrintNode(tree.RNode, level+1)
}
}
}
二叉排序树
也叫二叉搜索树、二叉查找树。二叉排序树是一颗左子树上的节点都小于根节点右子树上的节点都大于根节点,切其左右子树也是二叉树
平衡二叉树
定义:平衡二叉树,要么是一棵空树,或者是满足一下两种性质的二叉排序树。左子树的高度和又出事的深度之差的绝对值不超过1,切左右子树都是平衡二叉树
平衡因子
节点的平衡因子等于左子树的高度与右子树的高度差值的绝对值。即节点平衡因子=绝对值(左子树高度-右子树高度)
是否为平衡二叉树
每个节点的平衡因子都小于等于1那么这棵树为平衡二叉树