算法思想:二叉排序树又称二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:① 如果左子树不空,那么左子树上所有结点的值均小于它的根结点的值② 如果右子树不空,那么右子树上所有结点的值均大于它的根结点的值③ 左、右子树也分别为二叉排序树
代码如下:
package com.haobi;
/*
* 如何实现二叉排序树?
*
* 二叉排序树又称二叉查找树。它或者是一棵空树,或者是具有下列性质的二叉树:
* ① 如果左子树不空,那么左子树上所有结点的值均小于它的根结点的值
* ② 如果右子树不空,那么右子树上所有结点的值均大于它的根结点的值
* ③ 左、右子树也分别为二叉排序树
*/
//定义结点结构
class Node{
public int data;
public Node left;
public Node right;
public Node(int data) {
this.data = data;
this.left = null;
this.right = null;
}
}
public class Test1 {
//定义根结点
private Node root;
//构造方法
public Test1() {
root = null;
}
/**
* 将data插入到二叉排序树中
* @param data
*/
public void insert(int data) {
//创建新的结点
Node newNode = new Node(data);
//如果树为空
if(root==null) {
//则新结点即根结点
root = newNode;
}else {//如果树不为空
//定义current指向root结点(current表示当前结点)
Node current = root;
//定义parent结点(即要插入结点的父结点)
Node parent;
//寻找插入位置
while(true) {
//current指向root再赋给parent,表示从根结点开始查找
parent = current;
if(data<current.data) {//要插入的数据小于current(当前指向)的数据
current = current.left;
if(current == null) {
//找到插入位置并插入新结点
parent.left = newNode;
return;
}
}else {//要插入的数据大于current(当前指向)的数据
current = current.right;
if(current == null) {
//找到插入位置并插入新结点
parent.right = newNode;
return;
}
}
}
}
}
/**
* 输入数据构建二叉树
* @param data
*/
public void buildTree(int[] data) {
for(int i=0;i<data.length;i++) {
insert(data[i]);
}
}
/**
* 中序遍历方法递归实现
* @param root
*/
public void inOrder(Node root) {
if(root != null) {
inOrder(root.left);
System.out.print(root.data + " ");
inOrder(root.right);
}
}
/**
* 先序遍历方法递归实现
* @param root
*/
public void preOrder(Node root) {
if(root != null) {
System.out.print(root.data + " ");
preOrder(root.left);
preOrder(root.right);
}
}
/**
* 后序遍历方法递归实现
* @param root
*/
public void postOrder(Node root) {
if(root != null) {
postOrder(root.left);
postOrder(root.right);
System.out.print(root.data + " ");
}
}
public static void main(String[] args) {
Test1 tree = new Test1();
int[] data = {2,8,7,4,9,3,1,6,7,5};
//构建二叉树
tree.buildTree(data);
System.out.print("二叉树的中序遍历:");
tree.inOrder(tree.root);
System.out.println();
System.out.print("二叉树的先序遍历:");
tree.preOrder(tree.root);
System.out.println();
System.out.print("二叉树的后序遍历:");
tree.postOrder(tree.root);
System.out.println();
}
}
程序输出结果如下:
二叉树的中序遍历:1 2 3 4 5 6 7 7 8 9
二叉树的先序遍历:2 1 8 7 4 3 6 5 7 9
二叉树的后序遍历:1 3 5 6 4 7 7 9 8 2