学習ログ---再帰的でないツリーカーソルループ(前後の階層)
10505 ワード
実装:
ツリーノードクラス
カーソルループクラス:
resetメソッドは初期化です.
スタックに要素がない場合、isCompleteはfalse、終了フラグです.
このうちnextメソッドとは、印刷対象の次のノードを取得し、nextメソッドで取得したノードが処理するノードである.
前の順序:
中間パス:
getFarLeftは、印刷用に最も左側のノードを見つけます.
nextメソッドは、次の処理が必要なノードを見つけることです.
上の順を比較すると,ここでは左ルート右の方法であるため,各ノードを処理するには,プロセス中に通りかかったノードをスタックに入れ,getFarLeft法で最も左側のノードを探し出し,currentノードに値を与える.このノードのdataを印刷してnextの方法で次のノードを探して、先に右側のノードがあるかどうかを判断して、もしあるならば、getFarLeftの方法でこのノードの最も左側のノードを探して、もしないならばスタックの中の要素で上へ探します.
中順遍歴(2)
後の順序:
ダブルスタックメソッド!すべての要素の順序をtempスタックに入れます.stackスタックは中間スタックです.
層順遍歴
ここではキューを使用します.
後序遍歴の牛の追い詰め方法:
遍歴しながらflagで印刷が必要かどうかを判断し、flagでない場合は、そのノードの両側のサブノードを見つける必要があります.
テスト:
//
public class MyBiTree {
private MyBiTreeNode root;//
MyBiTree()
{
this.root = null;
}
MyBiTree(Object data,MyBiTree left,MyBiTree right)
{
MyBiTreeNode l,r;
if(left==null)
{
l = null;
}
else
{
l=left.root;
}
if(right==null)
{
r = null;
}
else
{
r = right.root;
}
this.root = new MyBiTreeNode(data,l,r);
}
//
public static void printBiTree(MyBiTreeNode root,int level)
{
if(root!=null)
{
printBiTree(root.getRightChild(),level+1);
if(level!=0)
{
// 6*(level-1)
for(int i=0;i<6*(level-1);i++)
{
System.out.print(" ");
}
System.out.print("-----");
}
System.out.println(root.getData());
printBiTree(root.getLeftChild(),level+1);
}
}
//
public static MyBiTreeNode getTreeNode(Object data,MyBiTreeNode left,MyBiTreeNode right)
{
MyBiTreeNode node = new MyBiTreeNode(data,left,right);
return node;
}
//
public static MyBiTreeNode search(MyBiTreeNode root,Object obj)
{
MyBiTreeNode node=null;
if(root==null)
{
return null;
}
if(root.getData().equals(obj))
{
return root;
}
if(root.getLeftChild()!=null)
{
node = search(root.getLeftChild(),obj);
}
if(root.getRightChild()!=null)
{
node = search(root.getRightChild(),obj);
}
return node;
}
}
ツリーノードクラス
//
public class MyBiTreeNode {
private MyBiTreeNode leftChild; //
private MyBiTreeNode rightChild; //
private Object data; //
MyBiTreeNode() {
this.leftChild = null;
this.rightChild = null;
}
MyBiTreeNode(Object data,MyBiTreeNode leftNode,MyBiTreeNode rightNode)
{
this.data = data;
this.leftChild = leftNode;
this.rightChild = rightNode;
}
public MyBiTreeNode getLeftChild() {
return leftChild;
}
public void setLeftChild(MyBiTreeNode leftChild) {
this.leftChild = leftChild;
}
public MyBiTreeNode getRightChild() {
return rightChild;
}
public void setRightChild(MyBiTreeNode rightChild) {
this.rightChild = rightChild;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
カーソルループクラス:
resetメソッドは初期化です.
スタックに要素がない場合、isCompleteはfalse、終了フラグです.
このうちnextメソッドとは、印刷対象の次のノードを取得し、nextメソッドで取得したノードが処理するノードである.
public class MyBiTreeIterator {
MyBiTreeNode root; //
MyBiTreeNode curr;// ;
boolean isComplete; //
MyBiTreeIterator()
{
}
、
MyBiTreeIterator(MyBiTreeNode root)
{
this.root = root;
}
public void reset()
{
}
public void next()
{
}
public boolean endOfBiTree()
{
return isComplete;
}
public Object getData()
{
return this.curr.getData();
}
}
前の順序:
//
public class MyBiTreePreIterator extends MyBiTreeIterator{
Stack<MyBiTreeNode> stack = new Stack<MyBiTreeNode>();
MyBiTreePreIterator()
{
}
MyBiTreePreIterator(MyBiTreeNode root)
{
super(root);
}
@Override
public void next() {
// TODO Auto-generated method stub
if(this.isComplete)
{
System.out.println(" !");
return ;
}
if(this.curr.getRightChild()!=null)
{
stack.push(this.curr.getRightChild());
}
if(this.curr.getLeftChild()!=null)
{
stack.push(this.curr.getLeftChild());
}
if(!stack.empty())
{
this.curr = stack.pop();
}
else
{
this.isComplete = true;
}
}
@Override
public void reset() {
// TODO Auto-generated method stub
if(this.root==null)
{
this.isComplete = true;
}
else
{
this.isComplete = false;
}
if(this.root==null)
{
return ;
}
this.curr = this.root;
}
}
中間パス:
getFarLeftは、印刷用に最も左側のノードを見つけます.
nextメソッドは、次の処理が必要なノードを見つけることです.
上の順を比較すると,ここでは左ルート右の方法であるため,各ノードを処理するには,プロセス中に通りかかったノードをスタックに入れ,getFarLeft法で最も左側のノードを探し出し,currentノードに値を与える.このノードのdataを印刷してnextの方法で次のノードを探して、先に右側のノードがあるかどうかを判断して、もしあるならば、getFarLeftの方法でこのノードの最も左側のノードを探して、もしないならばスタックの中の要素で上へ探します.
////
public class MyBiTreeInIterator extends MyBiTreeIterator {
Stack<MyBiTreeNode> stack = new Stack<MyBiTreeNode>();
MyBiTreeInIterator()
{
}
MyBiTreeInIterator(MyBiTreeNode root)
{
super(root);
}
//
public MyBiTreeNode getFarLeft(MyBiTreeNode node)
{
if(node==null)
{
return null;
}
while(node.getLeftChild()!=null)
{
stack.push(node);
node = node.getLeftChild();
}
return node;
}
@Override
public void next() {
// TODO Auto-generated method stub
if(this.isComplete)
{
System.out.println(" !");
return ;
}
// next, , 。
if(this.curr.getRightChild()!=null)
{
// 。
this.curr = getFarLeft(this.curr.getRightChild());
}
else if(!stack.isEmpty())
{
this.curr = stack.pop();
}
else
{
this.isComplete = true;
}
}
@Override
// , getFarLeft 。
public void reset() {
// TODO Auto-generated method stub
if(this.root==null)
{
this.isComplete = true;
}
else
{
this.isComplete = false;
}
if(this.root==null)
{
return ;
}
this.curr = getFarLeft(this.root);
}
}
中順遍歴(2)
public static void inTraverse(BinaryTree root) {
Stack s = new Stack();
BinaryTree p = root;
while(p!=null || !s.isEmpty()) {
if(p!=null) {
// push ,
s.push(p);
p = p.lchild;
}
else {
// p , , p ,
p = (BinaryTree)s.pop();
visit(p);
p = p.rchild;
}
}
}
後の順序:
ダブルスタックメソッド!すべての要素の順序をtempスタックに入れます.stackスタックは中間スタックです.
///
public class MyBiTreePostIterator extends MyBiTreeIterator{
Stack<MyBiTreeNode> stack = new Stack<MyBiTreeNode>();
Stack<MyBiTreeNode> temp = new Stack<MyBiTreeNode>();
MyBiTreePostIterator()
{
}
MyBiTreePostIterator(MyBiTreeNode root)
{
super(root);
}
@Override
public void next() {
// TODO Auto-generated method stub
if(this.isComplete)
{
System.out.println(" !");
return ;
}
if(!temp.isEmpty())
{
this.curr = temp.pop();
}
else
{
this.isComplete = true;
}
}
@Override
public void reset() {
// TODO Auto-generated method stub
if (this.root == null) {
this.isComplete = true;
} else {
this.isComplete = false;
}
if (this.root == null) {
return;
}
this.curr = root;
while (this.curr != null || stack.size() > 0)
{
while (this.curr != null) {
temp.push(this.curr);
//System.out.println(this.curr.getData());
stack.push(this.curr);
curr = this.curr.getRightChild();
}
if (stack.size() > 0) {
this.curr = stack.pop();
this.curr = this.curr.getLeftChild();
}
}
this.curr = temp.pop();
}
}
層順遍歴
ここではキューを使用します.
//
public class MyBiTreeLevIterator extends MyBiTreeIterator {
Queue<MyBiTreeNode> queue = new LinkedList<MyBiTreeNode>();
MyBiTreeLevIterator()
{
}
MyBiTreeLevIterator(MyBiTreeNode root)
{
super(root);
}
@Override
public void next() {
// TODO Auto-generated method stub
if(this.isComplete)
{
System.out.println(" !");
return ;
}
if(!queue.isEmpty())
{
this.curr = queue.remove();
if(this.curr.getLeftChild()!=null)
{
queue.add(this.curr.getLeftChild());
}
if(this.curr.getRightChild()!=null)
{
queue.add(this.curr.getRightChild());
}
}
else
{
this.isComplete = true;
}
}
@Override
public void reset() {
// TODO Auto-generated method stub
if (this.root == null) {
this.isComplete = true;
} else {
this.isComplete = false;
}
if (this.root == null) {
return;
}
this.curr = root;
if(this.curr.getLeftChild()!=null)
{
queue.add(this.curr.getLeftChild());
}
if(this.curr.getRightChild()!=null)
{
queue.add(this.curr.getRightChild());
}
}
}
後序遍歴の牛の追い詰め方法:
遍歴しながらflagで印刷が必要かどうかを判断し、flagでない場合は、そのノードの両側のサブノードを見つける必要があります.
public static void main(String[] args) {
//
BiTreeNode root = Test.makeTree();
final Object flag = new Object(); //
Deque<Object> stack = new LinkedList<Object>();
stack.push(root);
while (!stack.isEmpty()){
if (stack.peek() == flag){ //
stack.pop();
BiTreeNode node = (BiTreeNode)stack.pop();
System.out.print(node.getData());
}else{
//
BiTreeNode node = (BiTreeNode)stack.peek();
stack.push(flag); // ,
if (node.getRightChild() != null)
stack.push(node.getRightChild());
if (node.getLeftChild() != null)
stack.push(node.getLeftChild());
}
}
System.out.println();
}
}
テスト:
public class Test {
public static MyBiTreeNode makeTree()
{
MyBiTreeNode b,c,d,e,f,g;
g = MyBiTree.getTreeNode(new Character('G'), null, null);
d = MyBiTree.getTreeNode(new Character('D'), null, g);
b = MyBiTree.getTreeNode(new Character('B'), d, null);
e = MyBiTree.getTreeNode(new Character('E'), null, null);
f = MyBiTree.getTreeNode(new Character('F'), null, null);
c = MyBiTree.getTreeNode(new Character('C'), e, f);
return MyBiTree.getTreeNode(new Character('A'), b, c);
}
public static void main(String[] args) {
MyBiTreeNode root;
root = Test.makeTree();
System.out.println(" :");
MyBiTreeIterator it = new MyBiTreePreIterator(root);
for(it.reset();!it.endOfBiTree();it.next())
{
System.out.print(it.getData()+" ");
}
System.out.println();
System.out.println(" :");
it = new MyBiTreeInIterator(root);
for(it.reset();!it.endOfBiTree();it.next())
{
System.out.print(it.getData()+" ");
}
System.out.println();
System.out.println(" :");
it = new MyBiTreePostIterator(root);
for(it.reset();!it.endOfBiTree();it.next())
{
System.out.print(it.getData()+" ");
}
System.out.println();
System.out.println(" :");
it = new MyBiTreeLevIterator(root);
for(it.reset();!it.endOfBiTree();it.next())
{
System.out.print(it.getData()+" ");
}
System.out.println();
}
}