二叉树
根:根结点
叶子:终端结点,没有后继
双亲:直接前驱结点
孩子:直接后继结点
结点的度:有几个直接后继结点就是几度
树的度:所有结点度中的最大值
树的深度:所有结点中最大的层数
二叉树性质
满二叉树
每层都充满了结点
完全二叉树
除最后一层外,每一层节点数都达到最大值,在最后一层只缺少右边的若干结点
完全二叉树的顺序存储
左子右兄表示法
多叉树转换成一个二叉树
- 将同层所有兄弟连成一条线
- 将右儿子全部断开
3.将所有新连线顺时针45度转
二叉树遍历
大前提:先左后右
DLR先序遍历:根左右:0 1 3 7 4 2 5 6
LDR中序遍历:左根右:7 3 1 4 0 5 2 6
LRD右序遍历:左右根:7 3 4 1 5 6 2 0
二叉树操作方法
创建二叉树
先序遍历
中序遍历
后序遍历
二叉树树高度
二叉树最小树高度
获取叶子结点数
二叉树翻转
二叉树复制
go实现
type BinTreeNode struct {
Data interface{}
Lchild *BinTreeNode
Rchild *BinTreeNode
}
//创建二叉树
func (node *BinTreeNode) Create() {
//创建二叉树子节点
node1 := BinTreeNode{1, nil, nil}
node2 := BinTreeNode{2, nil, nil}
node3 := BinTreeNode{3, nil, nil}
node4 := BinTreeNode{4, nil, nil}
node1.Lchild = &node2
node1.Rchild = &node3
node2.Lchild = &node4
}
先序遍历
func (node *BinTreeNode) PreOrder() {
if node == nil {
return
}
//先打印数据
fmt.Println(node.Data)
//再左
node.Lchild.PreOrder()
//再右
node.Rchild.PreOrder()
}
中序遍历
func (node *BinTreeNode) MidOrder() {
if node == nil {
return
}
//再左
node.Lchild.PreOrder()
//先打印数据
fmt.Println(node.Data)
//再右
node.Rchild.PreOrder()
}
后序遍历
func (node *BinTreeNode) LastOrder() {
if node == nil {
return
}
//再左
node.Lchild.PreOrder()
//再右
node.Rchild.PreOrder()
//先打印数据
fmt.Println(node.Data)
}
文字不容易总结,按算法画图容易理解
获取二叉树的树高
func (node *BinTreeNode) TreeHeight() int {
if node == nil {
return 0
}
//左子树递归进入
lh := node.Lchild.TreeHeight()
//右子树递归进入
rh := node.Rchild.TreeHeight()
//累加,比较左右子树
if lh > rh {
lh++
return lh
} else {
rh++
return rh
}
}
获取二叉树最小树高度,也可以使用广度优先算法,遇到的第一个叶子结点的层级为最小二叉树高度
func (node *BinTreeNode) TreeHeight() int {
if node == nil {
return 0
}
//左子树递归进入
lh := node.Lchild.TreeHeight()
//右子树递归进入
rh := node.Rchild.TreeHeight()
//结点的子节点一个深度为0,另一个不为零的情况,防止计数归零
if lh == 0 || rh == 0 {
return lh + rh + 1
}
//返回深度浅的计数
if lh > rh {
return rh + 1
} else {
return lh + 1
}
}
获取叶子结点数
func (node *BinTreeNode) LeafNum(num *int) {
if node == nil {
return
}
//判断是否为叶子结点,左子树和右子树均为Nil
if node.Lchild == nil && node.Rchild == nil {
(*num)++
}
//左子树右子树递归
node.Lchild.LeafNum(num)
node.Rchild.ReafNum(num)
}
满二叉树翻转
func (node *BinTreeNode) Reverse() {
if node == nil {
return
}
//左子树和右子树交换
node.Lchild, node.Rchild = node.Rchild, node.Lchild
node.Lchild.Reverse()
node.Rchild.Reverse()
}
二叉树拷贝
func (node *BinTreeNode) Copy() *BinTreeNode {
if node==nil {
return
}
//左子树递归进入
lChild := node.Lchild.Copy
//右子树递归进入
rChild := node.Lchild.Copy
//创建新结点
newNode := new(BinTreeNode)
newNode.Data = node.Data
newNode.LChild = lChild
newNode.RChild = rChild
return newNode
}