通过java实现前,先搞懂二叉排序树的定义,其实定义很简单,要么是空树,要么就拥有以下特性:
(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3) 任意节点的左、右子树也分别为二叉查找树;
(4) 没有键值相等的节点。
以及关于二叉树的遍历,有三种,分别为先序、中序和后序
先序遍历:从根节点开始,先遍历左孩子并输出,当左孩子为空遍历右孩子并输出
比如图a先序遍历就是:10 6 8 15 13 11 14 17
中序遍历:往左孩子开始遍历,直到一个节点没有左孩子,开始原路返回并输出,知道碰到有右孩子的节点,开始遍历右孩子,如果该右孩子没有左孩子,则直接输出,否则从头开始
比如图a中序遍历就是:6 8 10 11 13 14 15 17
后序遍历:从左边的最末层往上遍历,先是遍历左孩子并输入,然后遍历右孩子并输出,根节点最后输出
比如图a后序遍历就是:8 6 11 14 13 17 15 10
那么弄清楚后,我们就来通过java实现,就特别简单了
1 package org.lanqiao; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 public class BinaryTree { 7 8 //二叉树的实体类 9 public static class Tree { 10 public Tree lChild; //左孩子 11 public Tree rChild; //右孩子 12 public int data; //数据域 13 14 public Tree(Tree lChild, Tree rChild, int data) { 15 this.lChild = lChild; 16 this.rChild = rChild; 17 this.data = data; 18 } 19 20 public Tree(int data) { 21 this.data = data; 22 this.lChild = null; 23 this.rChild = null; 24 } 25 } 26 27 //存放二叉树存放 28 static List<Tree> datas; 29 //根节点 30 static Tree root =null; 31 //当前节点 32 static Tree atNode =null; 33 34 public static void main(String[] args) { 35 //创建一个数组存放值 36 int[] items = {8,2,3,5,1,6,11,12,8,4}; 37 //创建二叉树 38 createBinaryTree(items); 39 System.out.print("先序遍历:"); 40 preorder(root); 41 System.out.print(" 中序遍历:"); 42 inorder(root); 43 System.out.print(" 后序遍历:"); 44 postorder(root); 45 } 46 47 //创建二叉树 48 public static void createBinaryTree(int[] items) { 49 //创建集合 50 datas = new ArrayList<Tree>(); 51 //遍历数组将值加入数据域 52 for(int i:items) { 53 datas.add(new Tree(i)); 54 } 55 //第一个节点为根节点 56 root = datas.get(0); 57 int size = items.length; 58 //开始关联左右孩子 59 for(int i=1;i<size;i++) { 60 //把根节点给当前节点 61 atNode = root; 62 //一直循环把节点插入为止 63 while(true) { 64 //判断待插入节点是否比当前节点小 65 if(datas.get(i).data<atNode.data) {//当比当前节点小 66 //判断当前节点的左孩子是否为空 67 if(atNode.lChild!=null) { 68 //把当前节点的左孩子给当前节点,并结束本次循环 69 atNode = atNode.lChild; 70 continue; 71 }else{ 72 //将节点插入,并结束整个循环 73 atNode.lChild = datas.get(i); 74 break; 75 } 76 }else if(datas.get(i).data>atNode.data){//比当前节点大 77 //判断当前节点的右孩子是否为空 78 if(atNode.rChild!=null) { 79 //把当前节点的右孩子给当前节点,并结束本次循环 80 atNode = atNode.rChild; 81 continue; 82 }else { 83 //将节点插入,并结束整个循环 84 atNode.rChild = datas.get(i); 85 break; 86 } 87 }else if(datas.get(i).data==atNode.data){ 88 //剩下的一种情况就是相等,二叉树不允许有相等的,所以删除相等的 89 datas.remove(i); 90 //删完后要对size进行减1,不然会越界 91 size--; 92 } 93 } 94 } 95 96 } 97 98 //先序遍历 99 public static void preorder(Tree node) { 100 if(node!=null) { 101 System.out.print(node.data+" "); 102 preorder(node.lChild); 103 preorder(node.rChild); 104 } 105 } 106 107 //中序遍历 108 public static void inorder(Tree node) { 109 if(node!=null) { 110 inorder(node.lChild); 111 System.out.print(node.data+" "); 112 inorder(node.rChild); 113 } 114 } 115 116 //后序遍历 117 public static void postorder(Tree node) { 118 if(node!=null) { 119 postorder(node.lChild); 120 postorder(node.rChild); 121 System.out.print(node.data+" "); 122 } 123 } 124 }