当前位置: 首页 > 知识库问答 >
问题:

我的问题是关于find(节点根,int级别)方法。这是在给定的二叉树中查找最深节点的代码

侯焱
2023-03-14

在find(Node root,int level)方法中,if(!=null)语句给我造成了混乱。假设到达二叉树的最后一个节点时,左边的节点指向NULL。语句find(root.left,++level)再次递归调用find()方法。现在,节点指向null。因此if(root!=null)不会执行。尽管如此,代码运行良好,下一行代码将在find()方法中执行。谁能给我解释一下,当if(root!=null)为false时,应该跳过整个if()块?

//Java程序查找给定二叉树类GFG中//最深节点的值{

// A tree node 
static class Node 
{ 

    int data; 
    Node left, right; 

    Node(int key) 
    { 
        data = key; 
        left = null; 
        right = null; 
    } 
} 
static int maxLevel = -1; 
static int res = -1; 

// maxLevel : keeps track of maximum level seen so far. 
// res : Value of deepest node so far. 
// level : Level of root 
static void find(Node root, int level) 
{ 
    if (root != null) **//THIS BLOCK SHOULD BE SKIPPED** 
    { 
        find(root.left, ++level); 

        // Update level and resue 
        if (level > maxLevel) 
        { 
            res = root.data; 
            maxLevel = level; 
        } 

        find(root.right, level); 
    } 
} 

// Returns value of deepest node 
static int deepestNode(Node root) 
{ 
    // Initialze result and max level 
    /* int res = -1; 
    int maxLevel = -1; */

    // Updates value "res" and "maxLevel" 
    // Note that res and maxLen are passed 
    // by reference. 
    find(root, 0); 
    return res; 
} 

// Driver code 
public static void main(String[] args) 
{ 

    Node root = new Node(1); 
    root.left = new Node(2); 
    root.right = new Node(3); 
    root.left.left = new Node(4); 
    root.right.left = new Node(5); 
    root.right.right = new Node(6); 
    root.right.left.right = new Node(7); 
    root.right.right.right = new Node(8); 
    root.right.left.right.left = new Node(50); 
    System.out.println(deepestNode(root)); 
} 

}

共有1个答案

柴兴贤
2023-03-14

如果node参数为null,则表示我们已经运行了树的末尾,应该“返回”。

null的测试必须在某个地方进行。将方法放在顶部意味着只需要对其进行一次编码。

另一个选项是在进行递归调用之前对其进行编码,因此我们从不在其中传递null,但这样测试就必须进行三次编码:一次在左调用之前,一次在右调用之前,一次在初始调用之前。

root是参数的坏名称,应将其称为node。仅仅因为对它的第一个调用是在根中传递的,并不意味着我们应该这样命名它。

 类似资料:
  • 我坚持使用递归函数来查找二叉树中节点的深度,更具体地说,是在else条件中: 如果树是二叉搜索树,知道左子值总是低于父值,右子值总是高于父值,我可以添加一个If条件,这样如果节点x值低于根,我总是返回根- 当查看函数时,假设节点总是存在的,节点x永远不是根,并且在开始时传递的深度总是0。 如果树是二叉搜索:

  • 我试图打印我的二叉搜索树的每个节点的所有值和深度。我很难想出一种递归计算深度的方法。到目前为止,我有一种仅打印树的每个值的方法。我将不胜感激一些指导,因为我觉得我让它变得比应有的更难。

  • 我现在正在读一本关于从二叉搜索树中删除节点的书,书中描述的过程对我来说似乎不必要地复杂。 在1号情况下,如果我们删除40,它将替换为30;在 2 号情况下,如果我们删除 40,它将被替换 35。 但在书中,它说应该从要删除的节点的右子树中找到替换,这可能涉及一些复杂的操作。 我在这里遗漏了什么吗?请指出。

  • 最近我一直在做个人项目,这个错误总是出现。异步是无效的,除非有一个我不知道的await函数,但这段代码给了我一个错误。我的代码没有一个异步函数,所以试图删除它是如此的烦人。我确实删除了它,查看答案以获得更多信息,如果你想复制代码。

  • 当我使用将新节点插入到二叉树中时,它只在子节点的位置插入新节点,即使根节点已经有左、右子节点。它不是访问子节点来创建更深层次的二叉树。 抱歉英语不好。

  • 我正在阅读一本书,该书解释了如何从二元搜索树中删除节点,基本上如果我们有这棵树: 我们想删除节点4,书上说我应该: 在其右子树(即6)中找到4的继任者 交换4和6 从右子树中删除6 将4的左侧子树(在本例中仅为1)附加到新节点6 因此我们得到 然而,我想到了另一种方法来做到这一点: 找到4个右子树的最小元素(即6) 将4的左子树附加到6(它不会有左子树) 将父元素(10)附加到4的右侧元素(8)。