树及树的遍历(一)
来源:互联网 发布:win10制作mac安装u盘 编辑:程序博客网 时间:2024/05/15 03:14
树(Tree)
树,顾名思义,长得像一棵树,不过通常我们画成一棵倒过来的树,根在上,叶在下。不说那么多了,图一看就懂:
当然了,引入了树之后,就不得不引入树的一些概念,这些概念我照样尽量用图,谁会记那么多文字?
树这种结构还可以表示成下面这种方式,可见树用来描述包含关系是很不错的,但这种包含关系不得出现交叉重叠区域,否则就不能用树描述了,看图:
面试的时候我们经常被考到的是一种叫“二叉树”的结构,二叉树当然也是树的一种了,它的特点是除了叶以外的节点都有两个子,图:
由此我们还可以推出“三叉树”:
当然还有“四叉树”,“五叉树”,“六叉树”……但太难画了,节点太多,略过。
九、树的遍历(Traversal)
值得再提一下的是二叉树,因为它确实比较特别,节点有两个子,这两个子是有左右之分的,颠倒一下左右,就是不一样的二叉树了,所以左右是不能随便颠倒的。
在第三篇讲到“队”的时候,提及到了广度优先遍历(Breadth-first traversal),除了广度优先遍历之外,还有深度优先遍历(Depth-first Traversal),深度优先遍历又可分为:前序遍历(Preorder Traversal),后序遍历(Postorder Traversal)和中序遍历(Inorder Traversal),其中中序遍历只有对二叉树才有意义,下图解释这几种遍历:
先编写二叉树类BinaryTree
public class BinaryTree { int data; //根节点数据 BinaryTree left; //左子树 BinaryTree right; //右子树 public BinaryTree(int data) //实例化二叉树类 { this.data = data; left = null; right = null; } public void insert(BinaryTree root,int data){ //向二叉树中插入子节点 if(data>root.data) //二叉树的左节点都比根节点小 { if(root.right==null){ root.right = new BinaryTree(data); }else{ this.insert(root.right, data); } }else{ //二叉树的右节点都比根节点大 if(root.left==null){ root.left = new BinaryTree(data); }else{ this.insert(root.left, data); } } }}
当建立好二叉树类后可以创建二叉树实例,并实现二叉树的先根遍历,中根遍历,后根遍历,代码如下:
public class BinaryTreePreorder { public static void preOrder(BinaryTree root){ //先根遍历 if(root!=null){ System.out.print(root.data+"-"); preOrder(root.left); preOrder(root.right); } } public static void inOrder(BinaryTree root){ //中根遍历 if(root!=null){ inOrder(root.left); System.out.print(root.data+"--"); inOrder(root.right); } } public static void postOrder(BinaryTree root){ //后根遍历 if(root!=null){ postOrder(root.left); postOrder(root.right); System.out.print(root.data+"---"); } } public static void main(String[] str){ int[] array = {12,76,35,22,16,48,90,46,9,40}; BinaryTree root = new BinaryTree(array[0]); //创建二叉树 for(int i=1;i<array.length;i++){ root.insert(root, array[i]); //向二叉树中插入数据 } System.out.println("先根遍历:"); preOrder(root); System.out.println(); System.out.println("中根遍历:"); inOrder(root); System.out.println(); System.out.println("后根遍历:"); postOrder(root);</span>非递归遍历请看:二叉树前序、中序、后序遍历非递归写法的透彻解析
转自:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/27/1766233.html
http://blog.sina.com.cn/s/blog_70600f720100ujnp.html
0 0
- 树及树的遍历(一)
- C# 二叉树的综合操作(一):查找、插入、最大(小)值、先序遍历、后序遍历及中序遍历
- 二叉树的建立及遍历(先序遍历、中序遍历、后续遍历、层次遍历)
- 二叉树的遍历(一)
- Java二叉树(一)--定义及前序、中序、后序、层次遍历及求高度的实现
- 二叉树的遍历(一)
- 二叉树的遍历(一)
- 二叉树的遍历(一)
- 二叉树的遍历(一)
- 树及树的遍历
- 树及树的遍历
- 树及树的遍历
- 树及树的遍历
- 树的存储及遍历
- 树的遍历及应用
- 二叉树(一)——二叉树的构造及三种遍历算法的递归实现(java版)
- 二叉树的非递归遍历及层次遍历
- 二叉树的建立、遍历、深度、高度及层次遍历
- SQL简介
- redis秒杀商品队列
- 去掉应用的标题栏
- My97DatePicker
- DrawableRatingBar
- 树及树的遍历(一)
- Android_android studio使用 9patch常见问题解决
- OpenGL立方体
- CentOS下网卡启动、配置等ifcfg-eth0教程
- 百度地图反地理编码问题总结(swift)
- mysql连接查询中索引的重要性
- 02-线性结构1 两个有序链表序列的合并 (15分)
- java快速开发平台zcurd
- Spring-Java配置文件远程连接mongdb数据库