在对二叉树进行升序排序时遇到问题

时间:2020-03-08 01:39:45

标签: java recursion

因此,最初的问题是编写方法chechkLeaves(),如果树的叶子按升序排序,则应返回true,否则返回false。您可以假定所有内部节点的数据均为空。您会发现为该问题定义其他递归帮助器方法很有用。

编辑:我的代码正在运行,但是如何修改代码,以便将val作为参数而不是全局变量传递?

   static int val = 0;
      static public boolean checkLeaves(Node root) {
         // int val = 0;
          if(root.data != 0 ) {
              if(root.data > val) {
                  val = root.data;
                  return true;
              } else {
                  return false;
              }
          } else {
              return checkLeaves(root.left) && checkLeaves(root.right);

          }
      }

1 个答案:

答案 0 :(得分:1)

在没有全局变量比较的情况下,您真正​​没有办法进行叶子的遍历。这可以通过按引用传递来完成,但是Java没有这种功能。因此,您有两个选择:

选项1)。请坚持使用此静态变量。

选项2),将val作为数组的参数,例如:

   private static public boolean checkLeaves(Node root, int[] val) {
    if (root.data != 0) {
     if (root.data > val[0]) {
      val[0] = root.data;
      return true;
     } else {
      return false;
     }
    } else {
     return checkLeaves(root.left, val) && checkLeaves(root.right, val);
    }
   }

并称之为:

checkLeaves(root, new int[] { Integer.MIN_VALUE });

通过将其设置为数组,您可以模拟“按引用传递”行为。即,通过参考原始值来更新变量的原始值。 Java中的所有内容都是按值传递的,因此变量的值将传递给参数,而不是对其的引用。

注意

我建议您命名变量以更具描述性。例如,您可以用val代替previousLeafValue或类似的名称。

此外,一个好的做法是使所有内容尽可能“私有”。在选项2中,您可以看到我的代码具有带私有访问修饰符的方法。您的静态变量也是如此。养成按习惯使事物私密的习惯,然后根据需要扩展其修饰符。