Go语言数据结构和算法(三十六)平衡二叉树

21 阅读3分钟

平衡二叉树是任意节点的左右子树的高度之多相差一的二叉树.平衡二叉树提供高效

的搜索 插入和删除操作.构造平衡二叉树的一种方法是使用已排序的元素数组.

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))
}

蓦然回首.在那灯火栏杆处.







如果大家喜欢我的分享的话.可以关注我的微信公众号

念何架构之路