12

これは私のコードが何をする必要があるかの写真です。

通話前:

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

通話後:

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

基本的に、この問題では、整数のバイナリ ツリーで 0 より大きいすべてのデータ値を 2 倍にする必要があります。以下の私のコードは、いくつかの値に対してこれを行いますが、早期に停止します。これを再帰的に修正する方法がわかりません。これは、上記のツリーの出力がどのように見えるかです。

       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

ノードを 2 倍にする場合でも、ツリーをトラバースする必要があります。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

ロジックの問題のように見えます-負のノードの子の値のみを2倍にします:

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

これを試してください: 条件ステートメントで間違いを犯していました。これは、このように書くべきでした。ルートのデータが正の場合 - 2 倍にしてください。そしてアウト!次のステップでは、左右の子ノードに進みます。

さらに、これに注意してください。再帰関数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 に答える