平衡二叉树是任意节点的左右子树的高度之多相差一的二叉树.平衡二叉树提供高效
的搜索 插入和删除操作.构造平衡二叉树的一种方法是使用已排序的元素数组.
1.步骤:
1.1:定义一个Node类来表示树的每个节点.Node类具有三个属性.节点中存储数据
对左子节点的引用和右子节点的引用.
1.2:实现一个函数来计算二叉树的高度.此函数将一个节点作为输入并返回以该节点
为根的树的高度.树的高度是从根节点到叶子节点的最长路径上的边数.
1.3:实现一个函数来检查二叉树是否是高度平衡.此函数将一个节点做为输入.如果以
该节点为根的树是高度平衡.则返回true.否则返回false.如果二叉树的左右子树之间
的高度最多为一.则二叉树是平衡的.
1.4:实现一个函数以从有序的值列表中构建平衡二叉树.此函数将有序的值列表作为
输入.分别从链表的左右两半递归构造左右子树.
1.5:实现在平衡二叉树中插入和删除节点的函数.当插入一个新节点的时候.首先通过
遍历树并跟随适当的子引用找到它在树中的位置.然后检查树在插入节点后是否保持
高度平衡.并在必要时执行重新平衡.删除节点时.首先找到它在树中的位置.然后按照
二叉树的删除规则进行删除.删除节点后树是否保持平衡,并重新执行平衡.
2.使用场景:
搜索树:
平衡二叉树.如AVL树或红黑树.通常用作搜索树的数据结构.
文件系统索引:
在文件系统中.平衡二叉树用于索引文件和目录.这样可以更快的搜索和检索文件和目
录.
决策树:
在机器学习中.决策树用于模拟决策过程.平衡二叉树可用于创建更高效且具有更好的
预测能力的决策树.
3.实战:
3.1方法:
type TreeNode2 struct {
Val int
Left *TreeNode2
Right *TreeNode2
}
func SortArrayToBst(array []int) *TreeNode2 {
if len(array) == 0 {
return nil
}
//找到数组中的中间元素.
mid := len(array) / 2
//以中间元素为根的treeNode.
root := &TreeNode2{
Val: array[mid],
}
//递归构造左右子树.
root.Left = SortArrayToBst(array[:mid])
root.Right = SortArrayToBst(array[mid+1:])
return root
}
3.2main方法:
func main() {
array := []int{1, 2, 3, 4, 5, 6, 7, 8}
root := data.SortArrayToBst(array)
fmt.Println(root.Val)
}
4.实战:
给定一个二叉树判断是否高度平衡.
4.1方法:
package data
type TreeNode2 struct {
Val int
Left *TreeNode2
Right *TreeNode2
}
// 检查二叉树是否平衡.
func IsBalanced(root *TreeNode2) bool {
if root == nil {
return true
}
//获取左右子树最大高度.
leftHeight := getHeight(root.Left)
rightHeight := getHeight(root.Right)
if absTree(leftHeight-rightHeight) > 1 {
return false
}
//递归检查左右子树高度是否平衡.
return IsBalanced(root.Left) && IsBalanced(root.Right)
}
// 返回给定节点二叉树高度.
func getHeight(node *TreeNode2) int {
if node == nil {
return 0
}
//获取左右子树的高度.
leftHeight := getHeight(node.Left)
rightHeight := getHeight(node.Right)
//返回左右子树最大高度.
return maxTreeHeight(leftHeight, rightHeight) + 1
}
// 返回x的绝对值.
func absTree(x int) int {
if x < 0 {
return -x
}
return x
}
func maxTreeHeight(x, y int) int {
if x > y {
return x
}
return y
}
4.2main方法:
package main
import (
"fmt"
"gomodule/data"
_ "gomodule/pubsub"
)
func main() {
root := &data.TreeNode2{
Val: 1,
Left: &data.TreeNode2{
Val: 2,
Left: &data.TreeNode2{
Val: 4,
},
Right: &data.TreeNode2{
Val: 5,
},
},
Right: &data.TreeNode2{
Val: 3,
Left: &data.TreeNode2{
Val: 6,
},
Right: &data.TreeNode2{
Val: 7,
},
},
}
fmt.Println(data.IsBalanced(root))
}
蓦然回首.在那灯火栏杆处.
如果大家喜欢我的分享的话.可以关注我的微信公众号
念何架构之路