二叉树

二叉树

根:根结点

叶子:终端结点,没有后继

双亲:直接前驱结点

孩子:直接后继结点

结点的度:有几个直接后继结点就是几度

树的度:所有结点度中的最大值

树的深度:所有结点中最大的层数

二叉树性质
满二叉树

每层都充满了结点

完全二叉树

除最后一层外,每一层节点数都达到最大值,在最后一层只缺少右边的若干结点

完全二叉树的顺序存储
左子右兄表示法

多叉树转换成一个二叉树

  1. 将同层所有兄弟连成一条线

在这里插入图片描述

  1. 将右儿子全部断开
    在这里插入图片描述

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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值