数据结构--树(tree)的简单介绍

来源:互联网 发布:js pubsub 编辑:程序博客网 时间:2024/06/05 10:46

简介  

定义树的一种自然的方式是递归。一般的树:

  

一棵树是N个节点和N-1条边的集合。

树叶(leaf):没有儿子的节点。

兄弟(siblings):具有相同父亲的节点。用类似的方法可以定义祖父(grandparent)和孙子(grandchild)关系。

节点n的深度(depth):从根节点到节点n的唯一路径的长。

节点n的高度(height):从n到一片树叶的最长路径的长。

祖先(ancestor):如果存在从n1到n2的一条路径,那么n1是n2的一位祖先。而n2是n1的一个后裔(descendant)。

真祖先(proper ancestor):先满足是祖先,如果n1不等于n2,那么n1是n2的真祖先,而n2是n1的真后裔(proper ancestor)。


路径的长是指该路径上边的条数。


树的实现

  方法一:在每一个节点除数据外还要有一些链,使得该节点的每一个儿子都有一个链指向它。

  方法二:将每个节点的所有儿子都放在树节点的链表中。


一颗树


转成树的第一儿子/下一兄弟表示法:


树节点的声明

class TreeNode{  Object element;  TreeNode firstChild;  TreeNode nextSiblings;}

树的遍历及应用

先序遍历(preorder traversal):根节点 左节点 右节点

中序遍历(inorder traversal):左节点 根节点  右节点

后序遍历(postorder traversal):左节点 右节点  根节点


应用于:UNIX和DOS等操作系统的目录结构等。


二叉树(binary tree)

  二叉树是一颗树,其中每个节点都不能有多于两个的儿子。


性质

  一颗平均二叉树的深度要比节点个数N小的多。其平均深度为O(根号N),而二叉查找树(binary search tree),其深度的平均值为O(logN)。

不幸的是,正如下图所示,这个深度是可以大到N-1的,即是最坏情形二叉树:



实现

class BinaryNode{  Object element;//节点上的数据  BinaryNode left;//左子节点  BinaryNode right;//右子节点}


当涉及到树时,我们也不明显地画出null链,因为具有N个节点的每一颗二叉树都将需要N+1个链。


例子:表达式树(expression tree)

  表达式树的树叶是操作数(operand),如常量或变量名,而其它的节点为操作符(Operator)。节点有可能含有多于两个的儿子。一个节点也有可能只有一个儿子,如具有一目减运算(unary minus operator)等情形。


构造表达式树

  我们一次一个符号地读入表达式。如果符号是操作数,那么就建立一个单节点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两棵树T1和T2(T1先弹出)并形成一颗新的树,该树的根就是操作符,它的左右儿子分别是T2和T1。然后将这颗新树压人栈中。来看一个例子,设输入为ab+cde+**:



查找树ADT--二叉查找树

二叉查找树:查找树ADT--二叉查找树

AVL树

待写

伸展树

待写

树的遍历

待写

  


0 0