数据结构--数tree

开场白: 树(Tree):有且仅有有个特定的结点 成为 根root
其余的结点互不相交的有限集,并且本身也是一棵树称为跟人root的子树SubTree
定义:之前都是一对一的线性结构,另一种一对多的数据结构–树Tree
树
注意:子树是互不相交的

结点拥有的子树数量称为结点的度(degree),度为0的称为叶子结点
除了根结点之外,其他的分支结点;一棵树的度是内部各分支结点的度的最大值!
树的度实例图


节点之间的关系:父节点 子节点 兄弟节点
树的深度Depth或高度:树中结点的最大层次

线性结构:有顺序存储和链式存储两种结构
对于树来说 主要介绍三种结构:双亲表示法,孩子表示法,孩子兄弟表示法
这里主要介绍一下双亲表示法:data是数据域 parent是指针域,存储该结点的双亲在数组当中的下标
因为除了根结点,其他结点一定有且仅有一个双亲
树的双亲表示法
这样存储结构,可以根据结点的parent指针很容易找到他的双亲结点(父节点),时间复杂度是 O ( 0 ) O(0) O(0),直到parent是-1;表示找到了树的根结点

如果想知道结点的子节点是啥,对不起请遍历整个结构才行!!
这时候可以设置一个结点最左边的孩子结点的域 叫做长子域,这样就能得到该结点的孩子结点;如果没有孩子就设置-1;

二叉树的定义

首先想到二分查找法:每次都会排除一半的情况
对于某个阶段都是两种结果的情形 都适合用树状结构来建模;而这种树是一种很特殊结构–二叉树(Binary Tree)

二叉树特点:

  1. 每个节点最多有两棵子树,所以二叉树结点当中最大度是2,树的度最大也是2
  2. 左子树和右子树是有顺序的,次序不能颠倒
  3. 即使树中的某个结点只有一颗子树,也要区分左右

其实这样想 我们的线性结构是树的一种能特殊变现形式!!!
满二叉树:所有分支节点都在左右子树,并且所有叶子结点都在一层上,这样的二叉树称为 满二叉树
总而言之 不能缺胳膊少腿的 叶子结点还得在一层上
完全二叉树:连续 而却 跟满二叉树中位置一样 同样的二叉树 完全二叉树的深度最小
遍历二叉树:遍历二叉树次序很重要,traversing binary tree:是指从根结点出发,按照某种次序依次访问二叉树中所有的结点(仅被访问一次)
Tree树的结构不同于线性结构,选择的方式不同 遍历的次序就完全不同了
遍历二叉树的方法:不论哪种次序遍历树,其本质都是把树变成一个线性序列;不同的次序决定不同的线性序列(不同的访问顺序)
二叉树的定义是使用的递归,所以实现遍历的方法也可以利用递归;

// 前序遍历算法!
public void preOrderTraverse(Tree t){
    
    
	if(t==null) return;
	System.out.println(t.val);
	preOrderTraverse(t.leftChild);
	preOrderTraverse(t.rightChild);
}

是不是非常简单明了?!!

// 中序遍历算法!!
public void preOrderTraverse(Tree t){
    
    
	if(t==null) return;
	preOrderTraverse(t.leftChild);
	System.out.println(t.val);
	preOrderTraverse(t.rightChild);
}

是不是感觉很神奇 ?

// 后序遍历算法!!
public void preOrderTraverse(Tree t){
    
    
	if(t==null) return;
	preOrderTraverse(t.leftChild);
	preOrderTraverse(t.rightChild);
	System.out.println(t.val);
}

是不是感觉树很好玩 鄙人看了一遍都理解了!你们也行
赫夫曼树:特殊的二叉树,平时的压缩和解压技术都是基于赫夫曼的研究发展而来

猜你喜欢

转载自blog.csdn.net/blackxc/article/details/107700208