二叉排序树,又称二叉查找树,它或者是一颗空树,或者是具有以下性质的二叉树:
①如果左子树不空,那么左子树上所有结点的值均小于它的根结点的值;
②如果右子树不空,那么右子树上所有结点的值均大于它的根结点的值;
③左、右子树也分别为二叉排序树
package binarytree;
/**
* @author wyl
* @time 2018年7月6日下午4:29:31
*/
public class BinaryTree {
private Node root;
public BinaryTree() {//初始化根结点
root=null;
}
//将data插入到排序二叉树中
public void insert(int data){
Node newNode=new Node(data);
if (root==null) {//若为空树,新节点即为根结点
root=newNode;
}else {//非根结点,找到插入的位置
Node curNode=root;
Node parent;
while(true){//寻找插入的位置
parent=curNode;
if (data<curNode.data) {
curNode=curNode.left;
if (curNode==null) {
parent.left=newNode;
return;
}
}else {
curNode=curNode.right;
if (curNode==null) {
parent.right=newNode;
return;
}
}
}
}
}
/**
* 将数值输入构建二叉树
* @param data
*/
public void buildTree(int[] data){
for(int i=0;i<data.length;i++){
insert(data[i]);
}
}
/**
* 先序遍历
* @param localRoot
*/
public void preOrder(Node localRoot){
if (localRoot!=null) {
System.out.print(localRoot.data+" ");
preOrder(localRoot.left);
preOrder(localRoot.right);
}
}
public void preOrder(){
this.preOrder(this.root);
}
/**
* 中序遍历
* @param localRoot
*/
public void inOrder(Node localRoot){
if (localRoot!=null) {
inOrder(localRoot.left);
System.out.print(localRoot.data+" ");
inOrder(localRoot.right);
}
}
public void inOrder(){
this.inOrder(this.root);
}
/**
* 后序遍历
* @param localRoot
*/
public void postOrder(Node localRoot){
if (localRoot!=null) {
postOrder(localRoot.left);
postOrder(localRoot.right);
System.out.print(localRoot.data+" ");
}
}
public void postOrder(){
this.postOrder(this.root);
}
public static void main(String[] args) {
// TODO Auto-generated method stub
BinaryTree bTree=new BinaryTree();
int[] data={2,8,7,4,9,3,1,6,7,5};
bTree.buildTree(data);
bTree.inOrder();
System.out.println();
bTree.preOrder();
System.out.println();
bTree.postOrder();
}
}
层序遍历二叉树
/**
* 用队列实现二叉树的层序遍历
* 思路:
* 根结点入队,然后每次都从队列中取出一个根结点打印该结点的值
* 若这个结点有子结点,则将它的子结点放入队列尾,直到队列为空。
*/
public void layerTranverse(){
if (this.root==null) {
return;
}
Queue<Node> q=new LinkedList<>();
q.add(this.root);
while(!q.isEmpty()){
Node node=q.poll();
System.out.print(node.data);
System.out.print(" ");
if (node.left!=null) {
q.add(node.left);
}
if (node.right!=null) {
q.add(node.right);
}
}
}