Как мне удалить листья двоичного дерева? - PullRequest
3 голосов
/ 14 апреля 2010

Я пытаюсь удалить все листья. Я знаю, что у листьев нет детей, это то, что у меня есть.

 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);

}

Ответы [ 7 ]

5 голосов
/ 14 апреля 2010

Гораздо проще, если разбить это так:

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

isLeaf, removeLeftChild и removeRightChild должны быть тривиальными для реализации.

5 голосов
/ 14 апреля 2010

n = null; вам не поможет, поскольку n - это просто локальная переменная вашей функции. Вместо этого вам нужно установить n.left = null; или n.right = null; для родителя.

Я не дам вам полного решения, так как оно очень пахнет домашней работой, но вы можете, например, добавить возвращаемое значение в вашу функцию, чтобы указать, является ли рассматриваемый узел листом или нет, и принять соответствующий действия в родительском (после вызова removeLeaves).

3 голосов
/ 14 апреля 2010

Вместо 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 голос
/ 05 февраля 2016

Вот простой 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;
    }

}
1 голос
/ 14 апреля 2010

Поскольку Java передает ссылки по значениям n = null; просто не работает. С помощью этой строки n указывал на лист и теперь ни на что не указывает. Таким образом, вы на самом деле не удаляете его из родительского элемента, а просто перенаправляете фиктивную локальную ссылку. Для решения сделайте то, что предложил Матфей.

0 голосов
/ 16 января 2018

Это должно работать-

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;

}
0 голосов
/ 06 января 2015
 /* @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);
        }
    }

}
...