数据结构 之 二叉树
Posted CallBack
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 之 二叉树相关的知识,希望对你有一定的参考价值。
对象由指针所构成的关系有很多种,如果没有循环可以广义称为树,否则称为图。
而二叉树是一种特殊的树形结构。常用与二叉树排序的应用。
二叉树的定义: 每个结点最多有两个子树的结构称为二叉树。所以两个分叉可以分别称为左子树和右子树
根节点:每棵树中只有1个根节点
中间节点:有一个或两个孩子
叶子节点:没有子节点的节点
前序遍历(先根序遍历):原理 根——>左——>右 先访问根节点,再访问左子树,在访问右子树
中序遍历: 原理 左——>根——>右 先访问左子树,再访问根节点,在访问右子树
后序: 原理 左——>右——>根 先访问左子树,再访问右子树,在访问根节点
那么上图的前序遍历 :ABCDEFGHK 中序遍历:BDCAEHGKF 这里后序就不写了
重点举例:中须遍历
1、先访问左子树 所以先排序 BCD。
2、在BCD中 B节点为根节点 而不存在子节点 所以第一个就是B,而B的子节点是一棵树,所以在此暂时不对C进行排序
3、当前C节点下有一个左叶子节点,按照(左根右)的排序规则,就应该是DC 那么联合B 目前的排序就是BDC
4、在中序遍历中 先访问左子树 --->根节点----->右子树的规则,第四个就是根节点A 目前BDCA
5、剩下EFGHK 这个节点组成的右子树,第一个E根节点下只有右节点而右节点是一颗树,所以只能排E这个节点 BDCAE
6、F节点是棵树,而G作为F节点的左子节点也是颗树 无法排序,继续往下,H左叶子节点 OK就是它了 HGK 这个树就排好了
7、剩下F 因为F作为根节点 排完左子树后就排根节点,所以现在就是F HGKF 该节点没有右子树,所以将之前排序的合并 就是上面写的 BDCAEHGKF
以下通过java 实现二叉树排序
/** * 二叉树的遍历 * 12 9 5 8 11 20 通过二叉树排序 增加一个规则如果加入的节点比本身节点小,那么放在左边否则放在右边 * 第一步 将 12 作为根节点 * 第二步 由于 9<12 所以9作为根节点的左叶子节点 * 第三步 5<12 放左边但左边已经有了一个左叶子节点 所以应该放 在9这个节点的下方作为左节点、 * 同理后面也依次排序,最后二叉树如下: * 12 * / \\ * 9 20 * / \\ * 5 11 * \\ * 8 * @author Administrator * 在java 中 treeMap 就是实现二叉树而提供的集合。 * 博客地址:二叉树的理解 */ public class Binary { private int data; private Binary left; private Binary right; public Binary(int i) { data=i; } public void add(Binary binary) { //根据之前的逻辑 就应该是将 当前传入的这个节点将本节点进行比较 if(binary.data<this.data) { //如果left是null那么放在左边,否则就应该递归 放该左节点的子节点 if(left==null) { left=binary; }else { left.add(binary); } }else { //同上 if(right==null) { right=binary; }else { right.add(binary); } } } public void travel() { //中序遍历就是先左子树 在根节点 在右子树 if(left!=null) { left.travel(); } System.out.println(data); if(right!=null) { right.travel(); } } //12 9 5 8 11 20 进行排序 public static void main(String[] args) { Binary binary=new Binary(12); binary.add(new Binary(9)); binary.add(new Binary(5)); binary.add(new Binary(8)); binary.add(new Binary(11)); binary.add(new Binary(20)); binary.travel(); } }
以上是关于数据结构 之 二叉树的主要内容,如果未能解决你的问题,请参考以下文章