Java在二进制搜索树中计算单个父项?

时间:2014-12-01 00:10:10

标签: java binary-tree binary-search-tree

我尝试创建一个名为 singleParent() 的方法,该方法计算BST中只有1个子节点的节点数。出于某种原因,我的singleParent()方法返回0。

我的代码:

二叉树

public abstract class BinaryTree {

    private TreeNode root;

    public BinaryTree() {
        this.root = null;
    }

    public void setRoot(TreeNode node) {
        this.root = node;
    }

    public TreeNode getRoot() {
        return this.root;
    }

    public boolean isEmpty() {
        return (this.root == null);
    }

    public int singleParent() {
        return getSingleParents(this.root, 0);
    }

    private int getSingleParents(TreeNode t, int count) {
        if(t != null) {
            if(t.getLeft() == null && t.getRight() != null)
                count++;
            else if(t.getLeft() != null & t.getRight() == null)
                count++;
            getSingleParents(t.getLeft(), count);
            getSingleParents(t.getRight(), count);
        }
        return count;
    }

    public void swapSubtrees() {
        doSwap(this.root);
    }

    private void doSwap(TreeNode p) {
        if(p != null) {
            TreeNode temp = p.getLeft();
            p.setLeft(p.getRight());
            p.setRight(temp);
            doSwap(p.getLeft());
            doSwap(p.getRight());
        }
    }

    public void inorder() {
        doInorderTraversal(this.root);
    }

    private void doInorderTraversal(TreeNode t) {
        if(t != null) {
            doInorderTraversal(t.getLeft());
            System.out.print(t.getValue() + " ");
            doInorderTraversal(t.getRight());
        }
    }

    public abstract void insert(Comparable item);
    public abstract TreeNode find(Comparable key);

} // end of class

我的主要方法:

public static void main(String[] args) {
    BinaryTree bst = new BinarySearchTree();
    bst.insert(14);
    bst.insert(4);
    bst.insert(15);
    bst.insert(3);
    bst.insert(9);
    bst.insert(18);
    bst.insert(7);
    bst.insert(16);
    bst.insert(20);
    bst.insert(5);
    bst.insert(17);

    int count = bst.singleParent();
    System.out.println(count);
}

这会创建一个如下所示的树:

            14
          /    \
        4       15
       / \        \
      3   9        18
         /        /  \
        7        16   20
       /          \       
      5            17 

所以count应该等于4,因为有4个节点只有1个孩子。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

For some reason, my singleParent() method is returning 0.

您进行递归调用getSingleParents(t.getLeft(), count);getSingleParents(t.getRight(), count);,但忽略了他们的返回值。

由于这个原因,该方法只检查根节点(14)是否是单个父节点,而不是它。

事实上,您不需要count中的getSingleParents参数:

private int getSingleParents(TreeNode t) {
    int count = 0;
    if(t != null) {
        if(t.getLeft() == null && t.getRight() != null)
            count++;
        else if(t.getLeft() != null & t.getRight() == null)
            count++;
        count += getSingleParents(t.getLeft());
        count += getSingleParents(t.getRight());
    }
    return count;
}