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

时间:2013-06-10 03:27:33

标签: java ascii-art

以下是我的代码需要做的图片。

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

4 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分: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);

答案 2 :(得分:3)

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

另外注意一下,你不需要在递归函数 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);      
      }
   }

答案 3 :(得分:2)

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