将数组转化成树

二叉树与链表有一定的相似之处,不同的是链表只有一个子节点,但二叉树有两个,所以在定义LinkNode类的时候要定义三个引用分别是 Parent(父(根)节点引用),Leftchild(左子节点引用),Rightchild(右子节点引用),又因为遍历是输出数据代码的位置导致了不同顺序的输出树,我使用的是根左右的输出顺序,而在将数组放入二叉树时我用的是左小右大的搜索树排列,程序打印出的数据就成了由小到大的排列。
数组转化成搜索树的
public class Tree {
public static LinkNode front = null;//根节点

public static void main(String arg[]){
Tree tree=new Tree();
int[] a=tree.createarray(20);
//将数组放入树种
tree.toTree(a);
tree.printTree(tree.front);
}
//将数组转化成树的方法(中序遍历)
/**将数组元素逐个放入树中 */
public LinkNode toTree(int[] b){
if(b==null){
System.out.println("数组为空");
}

front= new LinkNode(b[0]);
for(int i=1;i<b.length;i++){
dateTree(b[i],front);
}
return front;
}

/**数组放入树的规律*/
public void dateTree(int number,LinkNode n){
LinkNode node=new LinkNode(number);
if(n.getLeftchild()==null&&n.getRightchild()==null){
if(number<=(Integer)n.getObj()){
n.setLeftchild(node);
node.setParent(n);
}else if(number>(Integer)n.getObj()){
n.setRightchild(node);
node.setParent(n);
}
}else if(n.getLeftchild()==null&&n.getRightchild()!=null){
if(number<=(Integer)n.getObj()){
n.setLeftchild(node);
node.setParent(n);
}else if(number>(Integer)n.getObj()){
dateTree(number,n.getRightchild());
}
}else if(n.getLeftchild()!=null&&n.getRightchild()==null){
if(number<=(Integer)n.getObj()){
dateTree(number,n.getLeftchild());
}else if(number>(Integer)n.getObj()){
n.setRightchild(node);
node.setParent(n);

}
}else if(n.getLeftchild()!=null&&n.getRightchild()!=null){
if(number<=(Integer)n.getObj()){
dateTree(number,n.getLeftchild());
}else if(number>(Integer)n.getObj()){
dateTree(number,n.getRightchild());
}
}
}
//
//随机创建一个数组
public int[] createarray(int num){
int[] array=new int[num];
java.util.Random rd = new java.util.Random();
for(int i=0;i<num;i++){
array[i] = rd.nextInt(200) -100;
System.out.print(array[i]+" ");
}
System.out.println();
return array;
}
//二叉树的遍历
public void printTree(LinkNode root){
if(root!=null){
// //前序
// System.out.print(root.getObj());
// LinkNode temp=root.getLeftchild();
// printTree(temp);
// LinkNode comp=root.getRightchild();
// printTree(comp);
// //后序
// LinkNode temp=root.getLeftchild();
// printTree(temp);
// LinkNode comp=root.getRightchild();
// printTree(comp);
// System.out.println(root.getObj());
//中序
LinkNode temp=root.getLeftchild();
printTree(temp);
System.out.print(root.getObj()+" ");
LinkNode comp=root.getRightchild();
printTree(comp);

}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值