二叉排序树怎么构造java_学习记录11 --- 数据结构之二叉排序树的java实现

通过java实现前,先搞懂二叉排序树的定义,其实定义很简单,要么是空树,要么就拥有以下特性:

(1)若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值;

(2) 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;

(3) 任意节点的左、右子树也分别为二叉查找树;

(4) 没有键值相等的节点。

0ea2494ac1b1f736b45c9e2747170b6d.png

以及关于二叉树的遍历,有三种,分别为先序、中序和后序

先序遍历:从根节点开始,先遍历左孩子并输出,当左孩子为空遍历右孩子并输出

比如图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 packageorg.lanqiao;2

3 importjava.util.ArrayList;4 importjava.util.List;5

6 public classBinaryTree {7

8 //二叉树的实体类

9 public static classTree {10 public Tree lChild; //左孩子

11 public Tree rChild; //右孩子

12 public int data; //数据域

13

14 public Tree(Tree lChild, Tree rChild, intdata) {15 this.lChild =lChild;16 this.rChild =rChild;17 this.data =data;18 }19

20 public Tree(intdata) {21 this.data =data;22 this.lChild = null;23 this.rChild = null;24 }25 }26

27 //存放二叉树存放

28 static Listdatas;29 //根节点

30 static Tree root =null;31 //当前节点

32 static Tree atNode =null;33

34 public static voidmain(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("\n中序遍历:");42 inorder(root);43 System.out.print("\n后序遍历:");44 postorder(root);45 }46

47 //创建二叉树

48 public static void createBinaryTree(int[] items) {49 //创建集合

50 datas = new ArrayList();51 //遍历数组将值加入数据域

52 for(inti:items) {53 datas.add(newTree(i));54 }55 //第一个节点为根节点

56 root = datas.get(0);57 int size =items.length;58 //开始关联左右孩子

59 for(int i=1;i

61 atNode =root;62 //一直循环把节点插入为止

63 while(true) {64 //判断待插入节点是否比当前节点小

65 if(datas.get(i).data

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 voidpreorder(Tree node) {100 if(node!=null) {101 System.out.print(node.data+"\t");102 preorder(node.lChild);103 preorder(node.rChild);104 }105 }106

107 //中序遍历

108 public static voidinorder(Tree node) {109 if(node!=null) {110 inorder(node.lChild);111 System.out.print(node.data+"\t");112 inorder(node.rChild);113 }114 }115

116 //后序遍历

117 public static voidpostorder(Tree node) {118 if(node!=null) {119 postorder(node.lChild);120 postorder(node.rChild);121 System.out.print(node.data+"\t");122 }123 }124 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值