1.为什么要引入树
线性结构的特点是插入和删除速度慢,查找速度快。
链式结构的特点是查找速度慢,插入和删除速度快。
树型结构综合了线性结构和链式结构优点,查找,删除,插入速度都快
2.二叉树的构造
构造二叉树的节点
/**
* 二叉树的节点
* <p>Title: Node</p>
* <p>Description: </p>
* <p>Company:</p>
* @author 夏 杰
* @date 2015年12月23日下午10:51:24
* @version 1.0
*/
public class TreeNode {
//数据项
public int data;
//描述
public String description;
//左子节点
public TreeNode leftChild;
//右子节点
public TreeNode rightChild;
/**
* 构造方法
* <p>Title: </p>
* <p>Description: </p>
* @param data
*/
public TreeNode(int data,String description){
this.data = data;
this.description = description;
this.leftChild=null;
this.rightChild=null;
}
}
3.二叉树的递归遍历递归遍历的缺点:1.不停的压栈,效率低
2.容易造成栈溢出
* 递归前序遍历
*/
public void preOrder(TreeNode subTree) {
if(subTree!=null){
vist(subTree);
preOrder(subTree.leftChild);
preOrder(subTree.rightChild);
}
}
/**
*递归中序遍历
*/
public void inOrder(TreeNode subTree) {
if(subTree!=null){
inOrder(subTree.leftChild);
vist(subTree);
inOrder(subTree.rightChild);
}
}
/**
* 递归后续遍历
*/
public void postOrder(TreeNode subTree) {
if(subTree!=null){
postOrder(subTree.leftChild);
postOrder(subTree.rightChild);
vist(subTree);
}
}
4.二叉树的非递归遍历递归方法改成非递归主要依靠自己定义的一个栈来实现,而递归的实现是依靠进程中的栈(jvm中的栈)来实现的
5.二叉树的层次遍历
二叉树的层次遍历要借助队列来实现
第一步:先把根节点入队
第二步:再把根节点从队列取出来,在看看它有没有左孩子若有左孩子,则把左孩子入队,然后若有右孩子,则把右孩子入队(注意:要先是左孩子入队,后是右孩子入队)
第三步:重复第二步,退出重复while的条件是队列为空
/**
* 二叉树的层次遍历
* <p>Title: levelOrder</p>
* <p>Description: </p>
* @param root
*/
public void levelOrder(TreeNode root){
//创建一个队列
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
//层次遍历的出口是,队列为空
while(!queue.isEmpty()){
TreeNode vistedNode = queue.poll();
vist(vistedNode);
if(vistedNode.leftChild!=null){
queue.add(vistedNode.leftChild);
}
if(vistedNode.rightChild!=null){
queue.add(vistedNode.rightChild);
}
}
}