Java 无法按升序对二叉树的叶子进行排序

Java 无法按升序对二叉树的叶子进行排序,java,recursion,Java,Recursion,因此,最初的问题是编写方法chechklaves,如果树的叶子按递增顺序排序,它应该返回true,否则返回false。您可以假设所有内部节点的数据都为空。您会发现,为这个问题定义其他递归帮助器方法很有用 编辑:我的代码现在正在运行,但是如何修改代码,以便将val作为参数而不是全局变量传入 static int val = 0; static public boolean checkLeaves(Node root) { // int val = 0;

因此,最初的问题是编写方法chechklaves,如果树的叶子按递增顺序排序,它应该返回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);

          }
      }

在没有全局变量的情况下,实际上没有一种方法可以通过比较遍历树叶。这是通过引用传递可以实现的,但是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中的一切都是按值传递的,因此变量的值传递给参数,而不是参数的引用

笔记 我建议您将变量命名为更具描述性的名称。例如,您可以将其命名为previousLeafValue或其他名称,而不是val


此外,要遵循的一个好习惯是尽可能地将所有事情保密。在选项2中,您可以看到我的代码具有带有私有访问修饰符的方法。静态变量也是如此。养成一种习惯,习惯性地将事物私有化,然后根据需要扩展它们的修饰语。

但它不起作用。请更具体一点-它是否给出了错误的结果,是否给出了错误消息,是无限循环,还是其他什么?您需要给出完整的细节,包括您正在测试的输入和您期望的输出。另请参见如何编写。请立即阅读我的编辑。您的全局变量未被使用。您可以删除它,代码的行为也将相同。这是因为你在参数中的整数val无论如何都在隐藏该变量。它实际上做的是相反的,当我保留实例变量时,它没有给我正确的解决方案。你考虑过这个问题吗?您可以假设所有内部节点的数据都为空。。您的代码似乎假定node.data是int类型,而不是引用类型。感谢您的帮助!最后一件事,我需要在二进制搜索树中为延迟删除编写findMin的帮助,但无法找到解决方案。@user11452926-1这与您提出的问题不同。我需要帮助不是问题。