数据结构 - 二叉树
Posted Yanyu.Wu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 - 二叉树相关的知识,希望对你有一定的参考价值。
二叉树存储数据的优势
在实际使用时会根据链表和有序数组等数据结构的不同优势进行选择。有序数组的优势在于二分查找,链表的优势在于数据项的插入和数据项的删除。但是在有序数组中插入数据就会很慢,同样在链表中查找数据项效率就很低。综合以上情况,二叉树可以利用链表和有序数组的优势,同时可以合并有序数组和链表的优势,二叉树也是一种常用的数据结构。
解析二叉树
红色是根节点(root)。蓝色是子节点也是父节点,绿色的是子节点。其余的线是边。
节点和链表中的节点一样都可以存放数据信息。
通常来说树是顶部小,底部大,且树呈分层结构。
root节点时第0层,以此类推。二叉树最多有两个节点。
二叉树一个节点左子节点的关键字小于这个节点,右子节点关键字大于或等于这个父节点。
创建一个树节点
1 package com.DennisPoint; 2 3 public class Node { 4 public int iData; 5 public double dData; 6 public Node leftNode; 7 public Node rightNode; 8 //显示树节点信息 9 public void showNode() 10 { 11 System.out.println("{ "+iData+","+dData+" }"); 12 } 13 }
创建一个树结构
创建一个树结构首先是向一个树种插入数据节点。当一棵树为null时,数据项是从树的root节点处开始插入,之后的插入顺序是根据搜索节点顺序规则进行插入。具体规则是:如果数据项比父节点的数据项要小,则插在父节点的左节点(leftNode),如果比父节点的数据项要大,则将新的node插入在父节点的右节点处(rightNode)。在插入节点的过程中其实也就是对tree遍历的过程,最终根据条件遍历到左右节点为null时进行添加新的节点。
1 private Node root; 2 3 //插入Node 4 //插入之前需要判断是否为null 5 //为null需要比较大小直到currentNode为null就插入 6 public void insert(int iData, double dData) { 7 //创建node节点 8 Node newNode = new Node(); 9 newNode.iData = iData; 10 newNode.dData = dData; 11 //判断root node是否为null 12 if (root == null) { 13 root = newNode; 14 } 15 //不为null 16 else { 17 Node current = root; 18 Node parent; 19 while (true) { 20 parent = current;//保存当current变为null之前的那一个父节点 21 if (iData < current.iData)//插入左节点 22 { 23 current = current.leftNode;//不断向左node寻找是否为null 24 if (current == null) { 25 parent.leftNode = newNode; 26 return; 27 } 28 29 } 30 //插入右节点 31 else { 32 current = current.rightNode; 33 if (current == null) { 34 parent.rightNode = newNode; 35 return; 36 } 37 } 38 39 } 40 41 } 42 }
二叉树扩展
完全二叉树
叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。
平衡二叉树
左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
http://www.cnblogs.com/polly333/p/4798944.html
二叉查找树
又称为有序二叉树, 任意跟节点的左子树节点的key值均小于根节点, 右子树节点的key值均大于根节点.
红黑树
是一种平衡二叉树,但是是一个不完全的红黑树, 理解起来比较难, 可以参考下面的文章
https://blog.csdn.net/sun_tttt/article/details/65445754
以上是关于数据结构 - 二叉树的主要内容,如果未能解决你的问题,请参考以下文章