2015-04-19 60 views
0

所以我有3種方法1使用traverseAdd方法將節點添加到二叉樹中,另一種方法可以找到放置值的位置基於其父節點的樹內。我想消除traverseAdd方法,並使用add方法內的findLocation方法將新值添加到BST。在BST中查找節點位置並遞歸添加到樹中

public void add(int val) { 
      /*Adds a new node to the binary tree after traversing the tree and figuring out where it belongs*/ 
      Node nodeObjToAdd = new Node(val); 

      if(root == null){ 
      //if node root is not null root = new node value 
       root = nodeObjToAdd; 
      } 

      Node nodeTraversed = root; 

      traverseAdd(nodeTraversed, nodeObjToAdd); 
     } 
    private void traverseAdd(Node node, Node nodeObjToAdd){ 
     /*Traverses tree and finds a place to add the node to be added by comparing values of the left child and right child of the 
     * focus node*/ 
      if(nodeObjToAdd.value < node.value){ 
       if(node.leftChild == null){ 
        node.leftChild = nodeObjToAdd; 
       } 
       else { 
        //if the val < the root.value set int he constructor 
        traverseAdd(node.leftChild, nodeObjToAdd); 
       } 
      } 
      else if(nodeObjToAdd.value > node.value) { 
       if (node.rightChild == null) { 
        node.rightChild = nodeObjToAdd; 
       } else { 
        traverseAdd(node.rightChild, nodeObjToAdd); 
       } 
      } 
     } 
    public Node findNodeLocation(Node rootNode, int val) { 
     /*returns where a the Node after which the value would be added.*/ 
      if(val < rootNode.value && rootNode.leftChild != null){ 
       return rootNode.leftChild; 
      } 
      if(val >= rootNode.value && rootNode.rightChild != null){ 
       return rootNode.rightChild; 
      } 
      else 
       return this.root; 

     } 

回答

1
public void add(int val) { 
    if (root == null) { 
     root = new Node(val); 
    } 
    Node cur = root; 
    Node next = null; 
    while (true) { 
     next = findNodeLocation(cur, val); 
     if (next != cur) { 
      cur = next;   
     } else { 
      break; 
     } 
    } 
    if (val < cur.value) { 
     cur.leftChild = new Node(val); 
    } else { 
     cur.rightChild = new Node(val); 
    } 
} 

我認爲這應該工作

+0

此功能現在是建立雙根節點。 – user3236101

+0

無論如何重構findNodelocation方法我有,所以它是遞歸? – user3236101

+0

非常漂亮,現在我不知道爲什麼add方法在被調用時添加了兩個不同的根節點,並且無論如何都無法使findNodeLocation遞歸併仍然具有相同的功能。此外,當輸入2個以上的數字時,您的答案會中斷並進入無限循環。 – user3236101