结点Node类信息如下:
public class Node {
public int data;
public Node left; //左右子结点
public Node right;
public Node(int data){
this.data = data;
this.left = null;
this.right = null;
}
}
Java源代码如下:
import java.util.LinkedList;
import java.util.Queue;
public class binarySortTree {
public Node root; //根结点
public binarySortTree() {//无参构造函数,初始化排序二叉树
root = null;
}
//根据整型数组形参创建排序二叉树
public void buildTree(int[] data) {
for(int i=0 ; i<data.length ; i++) {
insert(data[i]); //循环插入新数据
}
}
//向排序二叉树中插入新数据
public void insert(int data) {
Node newNode = new Node(data);
if(root == null) { //根结点为null,直接设置根结点
root = newNode;
}
else {
Node currentNode = root; //当前结点,默认根结点
Node parentNode; //保存currentNode的上一层结点
while(true) {
parentNode = currentNode; //记录上一层结点
if(currentNode.data > data) { //判断新数据小于当前结点,往左走
currentNode = currentNode.left;
if(currentNode == null) { //最后到达叶结点,插入左边
parentNode.left = newNode;
return;
}
}
else if(currentNode.data < data) { //判断新数据大于当前结点,往右走
currentNode = currentNode.right;
if(currentNode == null) { //最后到达叶结点,插入右边
parentNode.right = newNode;
return;
}
}
else if(currentNode.data == data) { //判断等于的情况,判断为错误,违反二叉树的结构唯一性
System.out.println("error:数据重复!二叉树结构中已存在 <" + data + "> 数值的结点");
return;
}
}
}
}
//先序遍历
public void preOrder(Node root) {
if(root != null) {
System.out.print(root.data + " ");
preOrder(root.left);
preOrder(root.right);
}
}
//中序遍历
public void inOrder(Node root) {
if(root != null) {
inOrder(root.left);
System.out.print(root.data + " ");
inOrder(root.right);
}
}
//后序遍历
public void postOrder(Node root) {
if(root != null) {
postOrder(root.left);
postOrder(root.right);
System.out.print(root.data + " ");
}
}
//层次遍历
public void LevelOrder(Node root) {
if(root != null) {
Queue<Node> layerNodes = new LinkedList<Node>();//建立一个链表存结点的输出顺序信息
layerNodes.add(root); //根结点作第一输出
while(!layerNodes.isEmpty()) {
Node temp = layerNodes.poll();
System.out.print(temp.data + " ");
//判断temp子结点,若存在则使之尾插于链表layerNodes
if(temp.left != null)
layerNodes.add(temp.left);
if(temp.right != null)
layerNodes.add(temp.right);
}
}
}
public static void main(String[] args) {
int[] data = {5,2,4,8,3,1,10,3,6,7};
binarySortTree tree = new binarySortTree();
tree.buildTree(data); //data[]初始化排序二叉树
System.out.println("先序遍历:");
tree.preOrder(tree.root);
System.out.println();
System.out.println("中序遍历:");
tree.inOrder(tree.root);
System.out.println();
System.out.println("后序遍历:");
tree.postOrder(tree.root);
System.out.println();
System.out.println("层次遍历:");
tree.LevelOrder(tree.root);
System.out.println();
}
}
注意:在插入新结点时,若排序二叉树中已存在数值相同的结点,应作为错误处理并放弃该结点的插入。
我自己理解的是如果继续插入会导致出现该插左边还是插右边这种模拟两可的问题,会破坏二叉树自身结构的唯一性,即画出来的二叉树必须是只能有一种结构,不能存在两种或两种以上的结构;