2014-05-25 113 views
-1

有人可以向我解釋在遞歸遍歷中遞歸是如何工作的。這裏是我的inOrder()方法。爲了在二叉樹中遞歸

public void inOrder(BinaryNode p){ 
     if(p.left!=null){ 
      inOrder(p.left); 
     } 

     visit(p); 

     if(p.right!=null){ 
      inOrder(p.right); 
     } 


    } 
    public void visit(BinaryNode p){ 
     System.out.println(p.element); 
    } 

BinaryTree t=new BinaryTree(); 
     t.insert(5); 
     t.insert(t.root,4); 
     t.insert(t.root,6); 
     t.insert(t.root,60); 
     t.insert(t.root,25); 
     t.insert(t.root,10); 
     t.inOrder(t.root); 

inOrder()方法正確打印元素,但我不明白它是如何工作的。
當我打電話t.inOrder(t.root);因爲root擁有價值5這將是類似於inOrder(5); 並具有左節點所以if(p.left!=null){ inOrder(p.left); }

會得到executed.There遞歸調用將inOrder(4);
自4的左點爲null,則visit(4)是執行打印數值4的行。
但是之後又是如何打印的。雖然最初當方法被t.inOrder(t.root);調用時,局部變量p被分配了值爲5的BinaryNode,現在p是4。然後在打印出4之後,可以執行的下一行是

if(p.right!=null){ inOrder(p.right); }
但是因爲現在p.right在BinaryNode中引用了元素4的權利,而4的權利是null,所以這也不會被執行。
那麼如何保持遞歸?
它如何打印5和其餘節點?

+0

這是很難不圖紙解釋...也許找到一個在線視頻。 ..但讓我試試。我認爲你的問題是你將節點與價值混淆在一起;序(根)是不太一樣的序(5)...根是具有5也左右 – okaram

+0

至於它是如何實現的,通常有一個堆棧中的節點;當你調用一個函數時,參數會被推入棧中,也是返回的地方;當返回時,結果被放入堆棧,調用者的地址被取出,然後我們返回到那個地方。 – okaram

+0

@okaram:我明白inOrder(root)是一個BinaryNode作爲參數。我寫在order(5)中,以便我可以很容易地解釋它 –

回答

0

這是很難說的。它取決於你的實現..

我在序遍歷加入實施與..希望幫助

class BinaryTreeSearch{ 
public enum State{ 
Visited, Unvisited,Visiting; 

} 
//this is the Node used in the tree 
    static class Node{ 
    private int data; 
    private Node left; 
    private Node right; 
    public Node(int data){ 
     this.data = data; 
     left = null; 
     right = null; 
    } 
    public void setLeft(Node left){ 
     this.left = left; 
    } 
    public void setRight(Node right){ 
     this.right = right; 
    } 
    public Node getLeft(){ 
     return this.left; 
    }  
    public Node getRight(){ 
     return this.right; 
    } 
    public int getData(){ 
     return this.data; 
    } 
    public boolean equals(Node n){ 
     if(this.data ==(int) n.getData()) return true; 
     else 
      return false; 
    } 
} 
public static void main(String[] args){ 
    BinaryTreeSearch bts = new BinaryTreeSearch(); 
    bts.run(); 
} 
//execute the test case 
public void run(){ 
    Node root = new Node(10); 
    insert(root,new Node(20)); 
    insert(root,new Node(5)); 
    insert(root,new Node(4)); 
    insert(root,new Node(5)); 
    insert(root,new Node(15)); 

    inOrderTraverse(root); 
    System.out.println("\n" + binarySearch(root,new Node(10))); 
} 

// insert a node to the binary search tree 
public void insert(Node root, Node n){ 
    if(root == null|| n == null) return; 

    if(root.getData() > n.getData()){ 
     if(root.getLeft() == null){ 
      root.setLeft(n); 
      System.out.println("Added node to left of "+root.getData()+" of value "+n.getData());   
     }else{ 
      insert(root.getLeft(),n); 
     } 

    }else if(root.getData() < n.getData()){ 
     if(root.getRight() == null){ 
      root.setRight(n); 
      System.out.println("Added node to Right of "+root.getData()+" of value "+n.getData());  
     }else{ 
      insert(root.getRight(),n); 
     } 

    } 
} 
//in-order Traversal 
public void inOrderTraverse(Node root){ 
    if(root != null){ 
     inOrderTraverse(root.getLeft()); 
     System.out.print(" "+root.getData()); 
     inOrderTraverse(root.getRight()); 
    } 

} 
//binary search 
public boolean binarySearch(Node root,Node n){ 
    if(root == null || n == null) { 
     return false; 
    } 
    System.out.println(" Testing out "+root.getData()+" for value "+n.getData()); 
    if(root.getData() > n.getData()){ 
     return binarySearch(root.getLeft(),n); 
    }else if(root.getData() < n.getData()){ 
     return binarySearch(root.getRight(),n); 
    } 
    return true; 
} 
} 
0

我已經解釋盡我所能,而不圖片。 做打印(I)指印刷我 和做序(I)指序(i)中膨脹以序(左的i)>打印(I)>序(I的右側)

序(5)稱爲

TODO:序(4)>打印5>序(6)

做序(4)

TODO:序(左4)=無>打印(4)>序(右的4)=無>打印(5)

序6

做打印4

做打印5

做序6

TODO:序(左的6)=無>打印6>序(60)

辦打印6

辦60號

TODO:序(25)>打印60>序(右的60)=沒什麼

做序25

TODO:序(10)>打印25>序(25右側)=無>打印60

做序10

TODO:序(左的10)=無>打印10>序(右10)=無>打印25>打印60

不要打印10

做打印25

能打印60

所以,如果你看到打印的順序中的4 5 6 10 25 60