二叉树的创建和遍历

123 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

二叉树

子节点个数不能超过两个的的有序树,没有子节点的节点是叶子节点。

二叉树的性质

  1. 二叉树第i层上至多有2(i-1)个节点
  2. 深度为k的二叉树至多有2(k-1)个节点(k>=1)
  3. 对于任何一棵二叉树T,如果其终端节点树为n0,度为2的节点树为n2,则n0 = n2+1
  4. 具有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)
		}
	}
}

1.png

创建如上的一颗二叉树

运行效果:

run1.png

完整的两个代码文件:

文件的层级

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那么这棵树为平衡二叉树