我想编写一个可以添加到IntTree类的方法makePerfect。该方法应该添加节点,直到二叉树是“完美”树。完美的二叉树是所有叶子处于同一水平的树。另一种思考方式是将树节点添加到树中,直到从根到叶子的每条路径都是相同的长度。完美树的形状完全是三角形,每个分支节点都有两个孩子。添加到树中的每个节点都应存储值0。
调用之前和之后的示例:
我的代码适用于这些情况:
但其他人失败了。使用此方法,包含一个辅助方法,我们只能调用一次。
// 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));
}
}
我不测试哪些情况?被困在这一段时间,任何帮助将不胜感激。
我的代码在这些情况下失败:
我的输出与“name”列相同,但没有正确递归。
答案 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;
}