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

thi*_*fty 12 java ascii-art

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

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

After Call:
            +----+
            | -9 |
            +----+
           /      \
          /        \
      +----+      +----+
      |  6 |      | 30 |
      +----+      +----+
     /           /      \
    /           /        \
+----+      +----+      +----+
|  0 |      | 24 |      | 48 |
+----+      +----+      +----+
           /      \
          /        \
      +----+      +----+
      | 12 |      | -3 |
      +----+      +----+
Run Code Online (Sandbox Code Playgroud)

基本上这个问题要求我在二进制整数树中将所有大于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;
}
Run Code Online (Sandbox Code Playgroud)

pad*_*ddy 5

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

if(root != null) {
    if(root.data > 0) {
        root.data = 2 * root.data;
    }
    doublePositives(root.left);
    doublePositives(root.right);
}
Run Code Online (Sandbox Code Playgroud)


mis*_*hik 5

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

    if(root.data > 0) {
        root.data = 2* root.data;
    }else {
        root.left = doublePositives(root.left);
        root.right= doublePositives(root.right);
    }
Run Code Online (Sandbox Code Playgroud)

如果根值为正 - 您永远不会访问root.left和root.right.这样的事情会更好:

    if(root.data > 0) {
        root.data = 2* root.data;
    }
    root.left = doublePositives(root.left);
    root.right= doublePositives(root.right);
Run Code Online (Sandbox Code Playgroud)