2010-04-14 94 views
2

我試圖刪除所有的葉子。我知道葉子沒有孩子,這是我迄今爲止所擁有的。如何刪除二叉樹的葉子?

public void removeLeaves(BinaryTree n){ 

    if (n.left == null && n.right == null){ 

     n = null; 

    } 

    if (n.left != null) 

     removeLeaves(n.left); 

    if (n.right != null) 

     removeLeaves(n.right); 

} 

回答

5

如果你打破下來這樣的簡單得多:

public void removeLeaves(BinaryTree n){ 
    if (n.left != null) { 
    if (n.left.isLeaf()) { 
     n.removeLeftChild(); 
    } else { 
     removeLeaves(n.left); 
    } 
    } 
    // repeat for right child 
    // ... 
} 

isLeafremoveLeftChildremoveRightChild應該是微不足道的實施。

+0

+1 isLeaf – Heinzi 2010-04-14 06:50:11

3

而是N =空的,它應該是:

if(n.parent != null) 
    { 
    if(n.parent.left == n) 
    { 
     n.parent.left = null; 
    } 
    else if(n.parent.right == n) 
    { 
     n.parent.right == null); 
    } 
    } 
+1

這將失敗,'NullPointerException'如果根本身就是一片葉子。 – Heinzi 2010-04-14 06:36:44

+0

我正在做的是一個數據結構,這意味着我構建了BinaryTree類,在這種情況下,父類將是n。 – flopex 2010-04-14 06:36:49

+0

謝謝,Heinzi。固定。 – 2010-04-14 06:39:36

5

n = null;不會幫你,因爲n只是你的函數的局部變量。相反,您需要在父級上設置n.left = null;n.right = null;

我不會給你一個完整的解決方案,因爲這很像作業的味道,但是你可以,例如,爲你的函數添加一個返回值來表明所討論的節點是否是葉,家長採取適當行動(致電removeLeaves後)。

1

由於Java按值傳遞引用n = null;根本不起作用。用這條線n指向葉子,現在指向沒有。所以你實際上並沒有將它從父項中移除,你只是重新編寫了一個虛擬的本地參考。對於解決方案,馬修建議。

0
/* @author abhineet*/ 

public class DeleteLeafNodes { 


    static class Node{ 
     int data; 
     Node leftNode; 
     Node rightNode; 
     Node(int value){ 
      this.data = value; 
      this.leftNode = null; 
      this.rightNode = null; 
     } 
    } 



    public static void main(String[] args) { 

     Node root = new Node(1); 
     Node lNode = new Node(2); 
     lNode.leftNode = new Node(4); 
     root.leftNode = lNode; 
     Node rNode = new Node(3); 
     rNode.rightNode = new Node(5); 
     root.rightNode = rNode; 
     printTree(root); 
     deleteAllLeafNodes(root, null,0); 
     System.out.println("After deleting leaf nodes::"); 
     printTree(root); 

    } 

    public static void deleteAllLeafNodes(Node root, Node parent, int direction){ 
     if(root != null && root.leftNode == null && root.rightNode == null){ 
      if(direction == 0){ 
       parent.leftNode = null; 
      }else{ 
       parent.rightNode = null; 
      } 

     } 
     if(root != null && (root.leftNode != null || root.rightNode != null)){ 
      deleteAllLeafNodes(root.leftNode, root, 0); 
      deleteAllLeafNodes(root.rightNode, root, 1); 
     } 

    } 
    public static void printTree(Node root){ 
     if(root != null){ 
      System.out.println(root.data); 
      printTree(root.leftNode); 
      printTree(root.rightNode); 
     } 
    } 

} 
0

下面是二叉樹的一個簡單的java 方法刪除葉節點

public BinaryTreeNode removeLeafNode(BinaryTreeNode root) { 
    if (root == null) 
     return null; 
    else { 
     if (root.getLeft() == null && root.getRight() == null) {  //if both left and right child are null 
      root = null;            //delete it (by assigning null) 
     } else { 
      root.setLeft(removeLeafNode(root.getLeft()));   //set new left node 
      root.setRight(removeLeafNode(root.getRight()));   //set new right node 
     } 
     return root; 
    } 

} 
0

這應該與工作

public boolean removeLeaves(Node n){ 
    boolean isLeaf = false; 
    if (n.left == null && n.right == null){ 
     return true; 
     //n = null; 
    } 

    if (n!=null && n.left != null){ 

     isLeaf = removeLeaves(n.left); 
     if(isLeaf) n.left=null; //remove left leaf 
    } 

    if (n!=null && n.right != null){ 

     isLeaf = removeLeaves(n.right); 
     if(b) n.right=null; //remove right leaf 
    } 
    return false; 

}