问题 递归二进制搜索树x =更改(x)


这是我的代码需要做的图片。

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

After Call:
            +----+
            | -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;
}

7244
2018-06-10 03:27


起源



答案:


如果要加倍节点,仍需要遍历树。掉下来 else 所以你总是穿越。此外,我删除了分配,因为您没有更改树结构:

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

4
2018-06-10 03:36





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

    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);

5
2018-06-10 03:36





尝试这个: 你在条件陈述中犯了错误。这应该是这样写的。如果root有数据是正面的 - 让它加倍,罗杰那!出来!在下一步中,继续左右子节点。

另外请注意这一点,您不需要在递归函数中返回任何内容(除了void) doublePositives()

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);      
      }
   }

3
2018-06-10 03:37





当root为正数时,你不会进行递归调用。

您只在根为负时执行递归调用。要解决此问题,请删除其他内容。

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;
}

2
2018-06-10 03:36