關(guān)鍵就是要用一個(gè)棧來保存遍歷路徑。主要涉及類如下:
class TreeNode 這個(gè)類用來聲明樹的結(jié)點(diǎn),其中有左子樹、右子樹和自身的內(nèi)容。
class MyTree 這個(gè)類用來聲明一棵樹,傳入根結(jié)點(diǎn)。這里設(shè)計(jì)的比較簡單
class TreeEum 這個(gè)類是樹的迭代器,通過MyTree類的方法獲取,這里主要就是設(shè)計(jì)它了。代碼如下:
//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類,沒什么功能,傳入根結(jié)點(diǎn)構(gòu)造,getEnumerator()方法獲取迭代器。
class MyTree
{
TreeNode root;
public MyTree(TreeNode root)
{
this.root=root;
}
public TreeEnum getEnumerator()
{
return new TreeEnum(root);
}
}
//這個(gè)類為迭代器,有詳細(xì)解釋,相信各位能看懂。在棧中用了兩次泛型。
import java.util.Stack;
public class TreeEnum
{
private TreeNode root;
private Stack> store;/*保存遍歷左子樹但未遍歷右子樹的結(jié)點(diǎn)*/
private TreeNode next;
public TreeEnum(TreeNode root)
{
this.root=root;
store=new Stack>();
next=root;
}
public TreeNode next()
{
TreeNode current=next;
if(next!=null)
{
/*如果當(dāng)前結(jié)點(diǎn)的左子樹不為空,則遍歷左子樹,并標(biāo)記當(dāng)前結(jié)點(diǎn)未遍歷右子樹*/
if(next.left()!=null)
{
store.push(next);
next=next.left();
}
//如果當(dāng)前結(jié)點(diǎn)的左子樹為空,則遍歷右子樹
else if(next.right()!=null)
{
next=next.right();
}
/*如果當(dāng)前結(jié)點(diǎn)為葉子,則找未遍歷右子樹的結(jié)點(diǎn)并且遍歷它的右子樹*/
else{
if(!store.empty())/*判斷是否還有結(jié)點(diǎn)的右子樹未遍歷*/
{
TreeNode tmp=store.pop();
/*如果有未遍歷右子樹的結(jié)點(diǎn),但它的右子樹為空,且還有結(jié)點(diǎn)的右子樹未遍歷,*/
/*則一直往上取,直到取到未遍歷右子樹且右子樹不為空的結(jié)點(diǎn),遍歷它的右子樹.*/
while((tmp.right()==null)&&!store.empty())
{
tmp=store.pop();
}
next=tmp.right();
}
else
{
/*如果沒有哪個(gè)結(jié)點(diǎn)右子樹未遍歷,則表示沒有下一個(gè)結(jié)點(diǎn)了,設(shè)置next為null*/
next=null;
}
}
}
return current;
}
public boolean hasMoreElement()
{
return next!=null;
}
}
下面寫個(gè)測試類,不作解釋,相信大家看得懂
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");
}
}
由于急著實(shí)現(xiàn)迭代器,所以沒有去實(shí)現(xiàn)其他功能,迭代器類寫的也匆忙,還有很多可改進(jìn)的地方,考試大希望各位朋友可以提出意見和建議。
class TreeNode 這個(gè)類用來聲明樹的結(jié)點(diǎn),其中有左子樹、右子樹和自身的內(nèi)容。
class MyTree 這個(gè)類用來聲明一棵樹,傳入根結(jié)點(diǎn)。這里設(shè)計(jì)的比較簡單
class TreeEum 這個(gè)類是樹的迭代器,通過MyTree類的方法獲取,這里主要就是設(shè)計(jì)它了。代碼如下:
//TreeNode類,使用了泛型,由于比較簡單,考試.大提示不作解釋
class TreeNode
{
E node;
private TreeNode
private TreeNode
public TreeNode(E e)
{
this(e,null,null);
}
public TreeNode(E e,TreeNode
{
this.node=e;
this.left=left;
this.right=right;
}
public TreeNode
{
return left;
}
public TreeNode
{
return right;
}
}
//MyTree類,沒什么功能,傳入根結(jié)點(diǎn)構(gòu)造,getEnumerator()方法獲取迭代器。
class MyTree
{
TreeNode
public MyTree(TreeNode
{
this.root=root;
}
public TreeEnum getEnumerator()
{
return new TreeEnum(root);
}
}
//這個(gè)類為迭代器,有詳細(xì)解釋,相信各位能看懂。在棧中用了兩次泛型。
import java.util.Stack;
public class TreeEnum
{
private TreeNode
private Stack
private TreeNode
public TreeEnum(TreeNode
{
this.root=root;
store=new Stack
next=root;
}
public TreeNode
{
TreeNode
if(next!=null)
{
/*如果當(dāng)前結(jié)點(diǎn)的左子樹不為空,則遍歷左子樹,并標(biāo)記當(dāng)前結(jié)點(diǎn)未遍歷右子樹*/
if(next.left()!=null)
{
store.push(next);
next=next.left();
}
//如果當(dāng)前結(jié)點(diǎn)的左子樹為空,則遍歷右子樹
else if(next.right()!=null)
{
next=next.right();
}
/*如果當(dāng)前結(jié)點(diǎn)為葉子,則找未遍歷右子樹的結(jié)點(diǎn)并且遍歷它的右子樹*/
else{
if(!store.empty())/*判斷是否還有結(jié)點(diǎn)的右子樹未遍歷*/
{
TreeNode
/*如果有未遍歷右子樹的結(jié)點(diǎn),但它的右子樹為空,且還有結(jié)點(diǎn)的右子樹未遍歷,*/
/*則一直往上取,直到取到未遍歷右子樹且右子樹不為空的結(jié)點(diǎn),遍歷它的右子樹.*/
while((tmp.right()==null)&&!store.empty())
{
tmp=store.pop();
}
next=tmp.right();
}
else
{
/*如果沒有哪個(gè)結(jié)點(diǎn)右子樹未遍歷,則表示沒有下一個(gè)結(jié)點(diǎn)了,設(shè)置next為null*/
next=null;
}
}
}
return current;
}
public boolean hasMoreElement()
{
return next!=null;
}
}
下面寫個(gè)測試類,不作解釋,相信大家看得懂
public class TreeReader{
public static void main(String[] args)
{
TreeNode
TreeNode
TreeNode
TreeNode
TreeNode
TreeNode
TreeNode
TreeNode
TreeNode
TreeNode
TreeNode
TreeNode
TreeNode
MyTree tree=new MyTree(root);
TreeEnum eum=tree.getEnumerator();
while(eum.hasMoreElement())
{
System.out.print(eum.next().node+"--");
}
System.out.println("end");
}
}
由于急著實(shí)現(xiàn)迭代器,所以沒有去實(shí)現(xiàn)其他功能,迭代器類寫的也匆忙,還有很多可改進(jìn)的地方,考試大希望各位朋友可以提出意見和建議。