【问题标题】:Recursively generate an ASCII binary tree递归生成 ASCII 二叉树
【发布时间】:2013-06-05 16:10:19
【问题描述】:

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

通话前:

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

【问题讨论】:

    标签: java recursion binary-tree ascii-art


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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);
      

      【讨论】:

        【解决方案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);
            }
        }
        

        【讨论】:

          【解决方案4】:

          当根为正时,您不会进行递归调用。

          只有在根为负数时才进行递归调用。要解决此问题,只需删除 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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-04-19
            • 2014-03-29
            • 2011-02-15
            • 2010-12-07
            • 2020-09-15
            • 1970-01-01
            • 1970-01-01
            • 2013-01-26
            相关资源
            最近更新 更多