首页 > 解决方案 > 对二叉树的叶子进行升序排序时遇到问题

问题描述

所以最初的问题是编写方法 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);

          }
      }

标签: javarecursion

解决方案


在没有全局变量的情况下,您实际上没有办法通过比较来遍历叶子。这可以通过引用传递来完成,但 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 中,您可以看到我的代码具有带有私有访问修饰符的方法。您的静态变量也是如此。养成习惯,让事情变得私密,然后根据需要扩展它们的修饰符。


推荐阅读