从二叉树中删除叶子

时间:2011-10-20 17:18:12

标签: java binary-tree

public void deleteLeaves(BSTNode<T> p){                     //deletes leaves
    if(p.left != null){
      if(isLeaf(p.left))
        p.left = null;
    }
    else if(p.right != null){
      if(isLeaf(p.right))
        p.right = null;
    }
    else{
      deleteLeaves(p.right);
      deleteLeaves(p.left); 
    }
  }

我似乎无法弄清楚为什么它没有正确删除树叶。它似乎只删除树的最后一片叶子。任何有用的建议都会受到重视。

3 个答案:

答案 0 :(得分:2)

你的if语句有点搞砸了;只会使用一个分支。想想如果更近的p.leftp.right为空,会发生什么。

如果我理解你的数据结构,我可能会这样写:

// If there is something to the left...
if (p.left != null)
    if (isLeaf(p.left))
        p.left = null;             // delete it if it's a leaf...
    else
        deleteLeaves(p.left);      // else recurse.

// If there's something to the right...
if (p.right != null)
    if (isLeaf(p.right))
        p.right = null;            // delete it if it's a leaf...
    else
        deleteLeaves(p.right);     // else recurse.

答案 1 :(得分:0)

目前,如果p.left != null,它甚至不会检查p.rightelse-if应该是if。此外,你说两个相邻节点都是空的,然后在它们上面调用deleteLeaves(),这没有任何意义因为它们是空的。重组您的代码; @aioobe有一个很好的建议

答案 2 :(得分:0)

要正确使用递归,它必须在同一种控制语句中。你不应该检查if中的条件,然后在else if中执行实际的递归。