(1)为什么要使用二叉树?
因为它通常结合了另外两种数据结构的优点:1:有序数组,2:链表。在树中查找数据项的速度和在有序数组中查找一样快,并且插入数据项和删除数据项也和链表一样。
有序数组优缺点:
优点: 随机访问速度快,用二分查找法速度快。
缺点:插入,和删除都需要移动元素
物理存储结构:一般都是连续的内存地址 (也可以用链式存储结构--特殊情况)
链表优缺点
优点:插入 和删除元素快
缺点:查找数据项不容易,得从头遍历(或者双链表从尾遍历)
物理存储结构:一般不是连续内存地址;
逻辑结构
(1)集合结构 : 集合结构中的元素关系,除了同属于一个集合这个关系以外,再无其他关系。
(2)线性结构:线性结构中,元素间的关系就是一对一,顾名思义,一条线性的结构。
(3)树形结构:树形结构中,元素间的关系就是一对多,一颗大叔,伸展出的枝叶,也是类金字塔形。
(4)图形结构:图形结构中,元素间的关系就是多对多,举例:一个人可以通过6个人间接认识到世界上的每一个人。类蛛网形。
物理结构
顺序存储结构
链式存储结构
要是能有一种数据结构,既能像链表那样快速的插入和删除,又能像有序数组那样快速查找,那样就好了。
C位出厂: 特殊的树状结构 ---二叉树
常用术语:
父节点、子节点、叶子节点、 子树、访问、遍历、层、关键字
咱们要介绍的二叉树 叫 二叉搜索树
二叉搜索树的特征定义: 一个节点的左子节点的关键字值小于这个阶段,右子节点的关键字值大于或等于这个父节点。
二叉树在内存中有多种表示方式,最常用的方法是 把节点存在无关联的存储器中,而通过每个节点中指向自己节点的引用来链接。
还可以再内存中用数组表示树,用存储在数组中相对的位置来表示节点在树中的位置。
二叉树中序遍历可以按照从小到大顺序输出元素。
/**
* 中序遍历
* 二叉搜索树最常用的遍历方式是中序遍历
* 中序遍历搜索会使所有的节点按照关键字升序被访问到。
* 如果希望在二叉树中创建有序的数据序列,这是一种方法。
* 遍历步骤:
* 遍历树最简单的方法是用递归的方法。用递归的方法遍历整棵树要用一个节点
* 作为参数。初始化时,这个节点是根。这个方法只需要做三件事:
* 1.调用资深来遍历节点的左子树。
* 2.访问这个节点
* 3.调用自身来遍历节点的右子树
*
*
* **/
public void inorder(Node nodeRoot){
if(nodeRoot!=null){
inorder(nodeRoot.getLeftNode());
System.out.println("root.data"+nodeRoot.getData());
inorder(nodeRoot.getRightNode());
}
}
二叉树(不是二叉搜索树)可以用于表示包括二元运算符号 +、-、*、/的算术表达式。根节点保存运算符符号,其他节点或者存变了名(像A、B或C),或者保存运算符号。每一棵树都是一个合法的代数表达式。(使用场景有限-----!)
二叉搜索树中查找最大值,和最小值是特别容易的事情。
要查找最小值,先走到根的左子节点处,然后接着走到那个叶子节点的左子节点。依次类推,直到找到一个没有叶子节点的左子节点的节点,这个节点就是最小值的节点。 最大值 也是一样的道理,只是左子节点变成又子节点了而已。