递归二叉树搜索MakePerfect x = change(x)

时间:2013-06-10 14:56:35

标签: java

我想编写一个可以添加到IntTree类的方法makePerfect。该方法应该添加节点,直到二叉树是“完美”树。完美的二叉树是所有叶子处于同一水平的树。另一种思考方式是将树节点添加到树中,直到从根到叶子的每条路径都是相同的长度。完美树的形状完全是三角形,每个分支节点都有两个孩子。添加到树中的每个节点都应存储值0。

调用之前和之后的示例:enter image description here

我的代码适用于这些情况:

enter image description here

但其他人失败了。使用此方法,包含一个辅助方法,我们只能调用一次。

// WRITE YOUR CODE HERE
public void makePerfect() {
    overallRoot = makePerfect(overallRoot, 1);
}

private IntTreeNode makePerfect(IntTreeNode root, int lvl) {
    if(root != null) {
        if( lvl < height(root) ) {
            if(root.left == null && root.right != null) {
                root.left = new IntTreeNode(0);
                root.left = makePerfect(root.left, lvl + 1);
                root.right = makePerfect(root.right, lvl +1);
            }if(root.right == null && root.left != null) {
                root.right = new IntTreeNode(0);
                root.right = makePerfect(root.right, lvl +1);
                root.left =makePerfect(root.left, lvl +1);
            }else if ( root.left == null && root.right == null) {
                root.left = new IntTreeNode(0);
                root.right = new IntTreeNode(0);
                lvl++;
            }else {
            root.left = makePerfect(root.left, lvl +1);
            root.right = makePerfect(root.right, lvl +1);
            }
        }
    }
    return root;
}




// LEAVE THESE METHODS HERE, TO USE AS HELPERS
public int height() {
    return height(overallRoot);
}

private int height(IntTreeNode root) {
    if (root == null) {
        return 0;
    } else {
        return 1 + Math.max(height(root.left), height(root.right));
    }
}

我不测试哪些情况?被困在这一段时间,任何帮助将不胜感激。

我的代码在这些情况下失败: enter image description here

我的输出与“name”列相同,但没有正确递归。

4 个答案:

答案 0 :(得分:3)

else if ( root.left == null && root.right == null) {
                root.left = new IntTreeNode(0);
                root.right = new IntTreeNode(0);
                lvl++;

在调用之后,这些新节点将永远不会完善,所以如果它们的高度小于树高,你必须在这里添加一个条件来完善它们

else if ( root.left == null && root.right == null) {
                root.left = new IntTreeNode(0);
                root.right = new IntTreeNode(0);
                lvl++;
if(level <height (root)
makePerfect(root.left, lvl +1);
makePerfect(root.left, lvl +1);

答案 1 :(得分:2)

以下是未来参考的正确解决方案。

public void makePerfect() {
    int target = height(overallRoot);
    overallRoot = makePerfect(overallRoot,target, 1);
}

private IntTreeNode makePerfect(IntTreeNode root, int target,int lvl) {

    if(root != null) {
        if( lvl < target) {
            if(root.left == null && root.right != null) {
                root.left = new IntTreeNode(0);
                root.left = makePerfect(root.left,target, lvl + 1);
                root.right = makePerfect(root.right,target, lvl +1);
            }if(root.right == null && root.left != null) {
                root.right = new IntTreeNode(0);
                root.right = makePerfect(root.right,target,lvl +1);
                root.left =makePerfect(root.left,target, lvl +1);
            }else if ( root.left == null && root.right == null) {
                root.left = new IntTreeNode(0);
                root.right = new IntTreeNode(0);
                lvl++;
                if(lvl< target) {
                    makePerfect(root.left,target, lvl +1);
                    makePerfect(root.right, target, lvl +1);
                }
            }else {
            root.left = makePerfect(root.left, target,lvl +1);
            root.right = makePerfect(root.right,target, lvl +1);
            }
        }
    }
    return root;
}

答案 2 :(得分:1)

这是相当可疑的:

 if( lvl < height(root) )

您可能应该计算不在递归中的高度,而是将高度作为参数传递。现在你只计算每次递归的高度,所以它搞砸了,因为你可能想要做的是检查水平是否等于整个树的高度,而不是它是否等于整个树的高度。以当前节点为根的子树。

答案 3 :(得分:0)

或更优雅的解决方案:

public void makePerfect() {
    overallRoot = makePerfect(overallRoot, 1);
}

private IntTreeNode makePerfect(IntTreeNode root, int level) {
    if (level <= height()) {
        if (root == null) {
            root = new IntTreeNode(0);
        }
        root.left = makePerfect(root.left, level + 1);
        root.right = makePerfect(root.right, level + 1);
    }
    return root;
}