数据结构之二叉树
时间:2019-10-18
本文章向大家介绍数据结构之二叉树,主要包括数据结构之二叉树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
阅读目录
一、二叉树定义
二、二叉树遍历
二叉树定义
二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:
(1)空二叉树——如图(a);
(2)只有一个根结点的二叉树——如图(b);
(3)只有左子树——如图(c);
(4)只有右子树——如图(d);
(5)完全二叉树——如图(e)。
注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。 [1]
类型
(1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。
(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。
(3)平衡二叉树——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。
图3.1展示了一棵普通二叉树:
二叉树遍历
1. Golang实现
func main() {
consBinaryTree()
}
type Hero struct {
id int
name string
Left *Hero
Right *Hero
}
func consBinaryTree() {
//构建二叉树
root := &Hero{
id: 1,
name: "宋江",
}
left1 := &Hero{
id: 2,
name: "吴用",
}
left2 := &Hero{
id: 4,
name: "吴用1",
}
left3 := &Hero{
id: 5,
name: "吴用2",
}
right1 := &Hero{
id: 3,
name: "卢俊义",
}
root.Left = left1
root.Right = right1
right2 := &Hero{
id: 4,
name: "林冲",
}
right1.Right = right2
left1.Left = left2
left1.Right = left3
//前序遍历
PreOrder(root)
//中序遍历
InfixOrder(root)
}
//前序遍历 先输出root节点,然后在输出左子树,然后再输出右子树
func PreOrder(node *Hero) { //传入root 头节点
if node != nil {
fmt.Printf("name=%s, id=%d\n", node.name, node.id)
PreOrder(node.Left)
PreOrder(node.Right)
}
}
//中序遍历,先输入root左子数,在输出root,在输出root右子树
func InfixOrder(node *Hero) { //传入root 头节点
if node != nil {
InfixOrder(node.Left)
fmt.Printf("name=%s, id=%d\n", node.name, node.id)
InfixOrder(node.Right)
}
}
//后续遍历,先输入root左子数,在输出root右子树,在输出root
func PostOrder(node *Hero) { //传入root 头节点
if node != nil {
InfixOrder(node.Left)
InfixOrder(node.Right)
fmt.Printf("name=%s, id=%d\n", node.name, node.id)
}
}
原文地址:https://www.cnblogs.com/zhangliang91/p/11700825.html
- 无限级分类(非递归算法/存储过程版/GUID主键)完整数据库示例_(4)显示记录
- Android 2.x中使用actionbar - Actionbarsherlock (2)
- python读txt和xml
- 让Jexus支持高并发请求的优化技巧
- 数据压缩算法LZO (C#)
- Html之初体验
- 基于Wolfpack开发业务监控系统
- Android 2.x中使用actionbar - Actionbarsherlock
- Python-操作Memcache、Redis、RabbitMQ、
- 推荐[搜索引擎架构]的几篇文章
- 中小型商城系统中的分类/产品属性/扩展属性的数据库设计
- Linux下FTP虚拟账号环境部署总结
- Replace方法与正则表达式的性能比较
- 由索引节点(inode)爆满引发的问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android实现EditText图文混合插入上传功能
- Android实现红包雨动画效果
- 手把手教你启用Win10的Linux子系统(图文超详细)
- Android onCreateOptionsMenu的使用方法总结
- android截图事件监听的原理与实现
- 我常用的一些linux命令小结
- linux下安装mongodb教程
- Android中使用TagFlowLayout制作动态添加删除标签
- Android时间对话框使用方法详解
- Ubuntu基础设定:openssh-server的安装和使用介绍
- Android ProgressDialog的实例详解
- linux下获取文件的创建时间与实战教程
- Android 判断网络状态及开启网路
- Android判断后台服务是否开启的两种方法实例详解
- 在CentOS7上搭建Jenkins+Maven+Git持续集成环境的方法