java有序二叉树hasnext_JAVA技巧(java实现二叉树前序遍历迭代器)

JAVA技巧(java实现二叉树前序遍历迭代器)

考试吧(Exam8.com) 2008-11-25 08:00:00 评论(0)条

关键就是要用一个栈来保存遍历路径。主要涉及类如下:

class TreeNode 这个类用来声明树的结点,其中有左子树、右子树和自身的内容。

class MyTree 这个类用来声明一棵树,传入根结点。这里设计的比较简单

class TreeEum 这个类是树的迭代器,通过MyTree类的方法获取,这里主要就是设计它了。代码如下:

//TreeNode类,使用了泛型,由于比较简单,考试.大提示不作解释

class TreeNode

{

E node;

private TreeNode left;

private TreeNode right;

public TreeNode(E e)

{

this(e,null,null);

}

public TreeNode(E e,TreeNode left,TreeNode right)

{

this.node=e;

this.left=left;

this.right=right;

}

public TreeNode left()

{

return left;

}

public TreeNode right()

{

return right;

}

}

//MyTree类,没什么功能,传入根结点构造,getEnumerator()方法获取迭代器。

class MyTree

{

TreeNode root;

public MyTree(TreeNode root)

{

this.root=root;

}

public TreeEnum getEnumerator()

{

return new TreeEnum(root);

}

}

//这个类为迭代器,有详细解释,相信各位能看懂。在栈中用了两次泛型。

import java.util.Stack;

public class TreeEnum

{

private TreeNode root;

private Stack> store;/*保存遍历左子树但未遍历右子树的结点*/

private TreeNode next;

public TreeEnum(TreeNode root)

{

this.root=root;

store=new Stack>();

next=root;

}

public TreeNode next()

{

TreeNode current=next;

if(next!=null)

{

/*如果当前结点的左子树不为空,则遍历左子树,并标记当前结点未遍历右子树*/

if(next.left()!=null)

{

store.push(next);

next=next.left();

}

//如果当前结点的左子树为空,则遍历右子树

else if(next.right()!=null)

{

next=next.right();

}

/*如果当前结点为叶子,则找未遍历右子树的结点并且遍历它的右子树*/

else{

if(!store.empty())/*判断是否还有结点的右子树未遍历*/

{

TreeNode tmp=store.pop();

/*如果有未遍历右子树的结点,但它的右子树为空,且还有结点的右子树未遍历,*/

/*则一直往上取,直到取到未遍历右子树且右子树不为空的结点,遍历它的右子树.*/

while((tmp.right()==null)&&!store.empty())

{

tmp=store.pop();

}

next=tmp.right();

}

else

{

/*如果没有哪个结点右子树未遍历,则表示没有下一个结点了,设置next为null*/

next=null;

}

}

}

return current;

}

public boolean hasMoreElement()

{

return next!=null;

}

}

下面写个测试类,不作解释,相信大家看得懂

public class TreeReader{

public static void main(String[] args)

{

TreeNode n1=new TreeNode("n1");

TreeNode n2=new TreeNode("n2");

TreeNode n3=new TreeNode("n3");

TreeNode n4=new TreeNode("n4");

TreeNode n5=new TreeNode("n5");

TreeNode n6=new TreeNode("n6",null,n1);

TreeNode n7=new TreeNode("n7",n2,null);

TreeNode n8=new TreeNode("n8",n7,null);

TreeNode n9=new TreeNode("n9",null,n5);

TreeNode n10=new TreeNode("n10",n4,n9);

TreeNode n11=new TreeNode("n11",n6,n8);

TreeNode n12=new TreeNode("n12",n3,n10);

TreeNode root=new TreeNode("root",n11,n12);

MyTree tree=new MyTree(root);

TreeEnum eum=tree.getEnumerator();

while(eum.hasMoreElement())

{

System.out.print(eum.next().node+"--");

}

System.out.println("end");

}

}

由于急着实现迭代器,所以没有去实现其他功能,迭代器类写的也匆忙,还有很多可改进的地方,考试吧希望各位朋友可以提出意见和建议。

展开全文

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值