查找二叉树
2015-10-02 15:45
218 查看
什么是二叉树?
二叉树是一个每个结点至多只有两个子结点的树
二叉树的实现
二叉树的每个结点必须包含三个信息:1、结点所代表的元素 2、左边的子节点(若没有左子节点则为null) 3、右边的子节点(若没有右子节点则为null)。每个结点的结构如下所示:
什么是查找二叉树?
查找二叉树是一种特殊的二叉树它满足:对于树中的每个结点X,它的左子树中所有项的值小于X的值,而他右子树中所有项的值大于X的值
查找二叉树的实现代码
包含了插入、删除操作
二叉树是一个每个结点至多只有两个子结点的树
二叉树的实现
二叉树的每个结点必须包含三个信息:1、结点所代表的元素 2、左边的子节点(若没有左子节点则为null) 3、右边的子节点(若没有右子节点则为null)。每个结点的结构如下所示:
什么是查找二叉树?
查找二叉树是一种特殊的二叉树它满足:对于树中的每个结点X,它的左子树中所有项的值小于X的值,而他右子树中所有项的值大于X的值
查找二叉树的实现代码
包含了插入、删除操作
class BinarySearchTree<T> { private Comparator<? super T> cmp; private BinaryNode<T> root; private static class BinaryNode<T> { BinaryNode<T> left; BinaryNode<T> right; T data; public BinaryNode(BinaryNode<T> left,BinaryNode<T> right,T data) { this.left=left; this.right=right; this.data=data; } } public BinarySearchTree() { this(null); } public BinarySearchTree(Comparator<T> cmp) { root=null; this.cmp=cmp; } public void makeEmpty() { root=null; } public boolean isEmpty() { return root==null; } public T findMin() { if(findMin(root)==null) { return null; } return findMin(root).data; } public T findMax() { if(findMax(root)==null) { return null; } return findMax(root).data; } public void insert(T x) { insert(x, root); } public void remove(T x) { remove(x, root); } private void insert(T x,BinaryNode<T> t) { if (t==null) { root=new BinaryNode<T>(null, null, x); return; } int comResult=compare(x, t.data); if(comResult>0) { if (t.right==null) { t.right=new BinaryNode<T>(null, null, x); return; } else { insert(x,t.right); } } else if (comResult<0) { if (t.left==null) { t.left=new BinaryNode<T>(null, null, x); return; } else { insert(x,t.left); } } } private BinaryNode<T> remove(T x,BinaryNode<T> t) { if(t==null) { return null; } int comResult=compare(x, t.data); if(comResult>0) { t.right=remove(x, t.right); } else if (comResult<0) { t.left=remove(x,t.left); } else if(t.left!=null && t.right!=null) { t.data=findMin(t.right).data; t.right=remove(t.data,t.right); /** * 上面的语句可用下面两句替代 * t.data=findMax(t.left).data; * t.left=remove(t.data,t.left); */ } else { t=(t.left!=null) ? t.left : t.right;// } return t; } private BinaryNode<T> findMin(BinaryNode<T> b) { if(b==null) { return null; } else if(b.left==null) { return b; } return findMin(b.left); } private BinaryNode<T> findMax(BinaryNode<T> b) { if(b==null) { return null; } else if (b.right==null) { return b; } return findMax(b.right); } private int compare(T a,T b) { if (cmp!=null) { return cmp.compare(a, b); } else { return ((Comparable)a).compareTo(b); } } /****************************下面的代码是为了打印出二叉树,不属于二叉树的具体实现********************/ //层序遍历 public void printTree() { Queue<BinaryNode<T>> queue=new LinkedList<BinaryNode<T>>(); queue.offer(root); BinaryNode<T> node; int current=0; int last=0; while (!queue.isEmpty()) { last=queue.size(); current=0; while (current<last) { node=queue.poll(); System.out.print(node.data+" "); if(node.left!=null) { queue.offer(node.left); } if (node.right!=null) { queue.offer(node.right); } current++; } System.out.println(); } } }
相关文章推荐
- SQL常用命令
- HDU - 1200 To and Fro(水)
- 数据库的优化
- 枚举类型的基本用法
- Matlab基础知识
- Extjs4.2 model关联读复杂XML
- 面试题22:栈的压入、弹出序列
- vfork http://blog.csdn.net/tennysonsky/article/details/45847107
- BZOJ 3531 旅行【树链剖分】
- 数据库最最常用语句(10年工作笔记)
- java抽象类
- 如何在Linux上使用netstat命令查证DDOS攻击
- android布局属性大全
- 安卓控件使用系列12:CheckBox复选框控件的使用
- 轮廓线动态规划问题
- swift闭包
- iOS 多线程实例(NSThread售票窗口的模拟)
- web前端性能优化
- ZOJ - 2421 Recaman's Sequence(打表水题)
- swift函数