递归生成ASCII二叉树

12

这是我的代码需要完成的图片。

调用之前:

            +----+
            | -9 |
            +----+
           /      \
          /        \
      +----+      +----+
      |  3 |      | 15 |
      +----+      +----+
     /           /      \
    /           /        \
+----+      +----+      +----+
|  0 |      | 12 |      | 24 |
+----+      +----+      +----+
           /      \
          /        \
      +----+      +----+
      |  6 |      | -3 |
      +----+      +----+

通话后:

            +----+
            | -9 |
            +----+
           /      \
          /        \
      +----+      +----+
      |  6 |      | 30 |
      +----+      +----+
     /           /      \
    /           /        \
+----+      +----+      +----+
|  0 |      | 24 |      | 48 |
+----+      +----+      +----+
           /      \
          /        \
      +----+      +----+
      | 12 |      | -3 |
      +----+      +----+

基本上,这个问题要求我将二叉树中大于0的所有数据值都加倍。我的下面代码可以做到这点,但只能处理少量数据值就停止了。我不确定如何用递归来修复它。这是给定树的输出示例。

       overallRoot
         _[-9]_______________
        /                    \
    _[6]                 _____[30]
   /                    /         \
[0]                _[12]           [24]
                  /     \
               [6]       [-3]
public void doublePositives() {
    doublePositives(overallRoot);
}

private IntTreeNode doublePositives(IntTreeNode root) {
    if (root != null) {
        if (root.data > 0) {
            root.data = 2 * root.data;
        } else {
            root.left = doublePositives(root.left);
            root.right = doublePositives(root.right);
        }
    }
    return root;
}
4个回答

5
如果您要将节点加倍,则仍需要遍历树。删除else以便始终进行遍历。此外,我已经删除了赋值,因为您不会改变树结构。
if(root != null) {
    if(root.data > 0) {
        root.data = 2 * root.data;
    }
    doublePositives(root.left);
    doublePositives(root.right);
}

5
看起来是逻辑问题 - 你只会将负节点的子代值加倍:
if (root.data > 0) {
    root.data = 2 * root.data;
} else {
    root.left = doublePositives(root.left);
    root.right = doublePositives(root.right);
}

如果根节点的值为正数,则您永远不会进入根节点的左右子树。可以这样修改代码使其更加清晰易懂:
if (root.data > 0) {
    root.data = 2 * root.data;
}
root.left = doublePositives(root.left);
root.right = doublePositives(root.right);

3
尝试这个: 您在条件语句中犯了错误。应该像这样编写。如果根节点具有正数据-使其加倍,明白!并退出!在下一步中,继续处理左右子节点。 此外,请注意,在递归函数doublePositives()中,您不需要返回任何内容(除void外)。
public void iWillDoit() {
    doublePositives(Root);
}

private void doublePositives(IntTreeNode root) {
    if (root != null) {
        if (root.data > 0) {
            root.data = 2 * root.data;
        }
        doublePositives(root.left);
        doublePositives(root.right);
    }
}

2

当根为正数时,您没有执行递归调用。

只有当根为负数时,您才执行递归调用。要解决此问题,请删除else。

private IntTreeNode doublePositives(IntTreeNode root) {
    if (root != null) {
        if (root.data > 0) {
            root.data = 2 * root.data;
        }
        root.left = doublePositives(root.left);
        root.right = doublePositives(root.right);
    }
    return root;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接