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

4 回答 4

5

如果您将节点加倍,您仍然需要遍历树。删除,else以便您始终遍历。另外,我已经删除了分配,因为您没有更改树结构:

if(root != null) {
    if(root.data > 0) {
        root.data = 2 * root.data;
    }
    doublePositives(root.left);
    doublePositives(root.right);
}
于 2013-06-10T03:36:07.773 回答
5

看起来像一个逻辑问题 - 您只会将负节点的子节点的值加倍:

if (root.data > 0) {
    root.data = 2 * root.data;
} else {
    root.left = doublePositives(root.left);
    root.right = doublePositives(root.right);
}

如果根值为正 - 你永远不会到达 root.left 和 root.right。像这样的东西会更好:

if (root.data > 0) {
    root.data = 2 * root.data;
}
root.left = doublePositives(root.left);
root.right = doublePositives(root.right);
于 2013-06-10T03:36:21.347 回答
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);
    }
}
于 2013-06-10T03:37:00.927 回答
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;
}
于 2013-06-10T03:36:01.420 回答