java二叉树实现、遍历、求深度

来源:互联网 发布:三大运营商哪个网络好 编辑:程序博客网 时间:2024/06/03 14:52
import java.util.*;class node{int data;node lchild;node rchild;public node(int value){data=value;lchild=null;rchild=null;}}class BiTree{ArrayList nodeList;//nodelist即为树public BiTree(int[] a){//传入一个数组nodeList=new ArrayList();for(int i=0;i<a.length;i++)//先将数组每个int转为node再链接nodeList.add(new node(a[i]));for(int i=0;i<a.length/2-1;i++){//最后一个内部结点可能没有右孩子nodeList.get(i).lchild=nodeList.get((i+1)*2-1);nodeList.get(i).rchild=nodeList.get((i+1)*2);}if(a.length % 2==1){//有nodeList.get(a.length/2-1).lchild=nodeList.get(a.length-2);nodeList.get(a.length/2-1).rchild=nodeList.get(a.length-1);}else{nodeList.get(a.length/2-1).lchild=nodeList.get(a.length-1);}}public void Inorder(node n){//以node n为根的任意一棵树if(n==null)return;Inorder(n.lchild);System.out.print(n.data+" ");Inorder(n.rchild);}public void Preorder(node n){//以node n为根的任意一棵树if(n==null)return;System.out.print(n.data+" ");Preorder(n.lchild);Preorder(n.rchild);}public void Postorder(node n){//以node n为根的任意一棵树if(n==null)return;Postorder(n.lchild);Postorder(n.rchild);System.out.print(n.data+" ");} //前序遍历的非递归实现 public void nonRecPreorder(node n){ Stack stack=new Stack();//java自带的Stack node now=n; while(now!=null || stack.size()>0){ while(now!=null){//GoFarLeft System.out.print(now.data+" ");//先序 stack.push(now);//进栈 now=now.lchild; } if(stack.size()>0){ now=stack.pop(); now=now.rchild; } } } //中序遍历的非递归实现 public void nonRecInorder(node n){ Stack stack=new Stack();//java自带的Stack node now=n; while(now!=null || stack.size()>0){ while(now!=null){//GoFarLeft stack.push(now); now=now.lchild; } if(stack.size()>0){ now=stack.pop(); System.out.print(now.data+" "); now=now.rchild; } } } //后序遍历的非递归实现 public void nonRecPostorder(node n){ Stack stack=new Stack();//java自带的Stack node now=n; while(now!=null){ while(now.lchild!=null){//GoFarLeft,和前面的不一样在于停在叶节点(非null) stack.push(now); now=now.lchild; } while(now!=null && (now.rchild==null||now.rchild==n)){//当前结点无右子树或右子树已经输出.后序就是栈顶节点无右子树就输出 System.out.print(now.data+" "); n=now;//纪录上一个已输出结点 if(stack.empty()) return; now=stack.pop(); } //处理右子树 stack.push(now); now=now.rchild; } } public int height(node n){//求以n为根的树的深度 if(n==null) return 0; else{ if(n.lchild!=null && n.rchild!=null) return Math.max(height(n.lchild),height(n.rchild))+1; else if(n.lchild!=null && n.rchild==null) return height(n.lchild)+1; else if(n.rchild!=null && n.lchild==null) return height(n.rchild)+1; else return 1; } } }public class test{public static void main(String[] args){int a[]=new int[10];a[0]=1;a[1]=2;a[2]=3;a[3]=4;a[4]=5;a[5]=6;a[6]=7;a[7]=8;a[8]=9;a[9]=10;BiTree tree=new BiTree(a);// tree.Inorder(tree.nodeList.get(0));// tree.nonRecPostorder(tree.nodeList.get(0));System.out.println(tree.height(tree.nodeList.get(8)));}}
0 0
原创粉丝点击