插入二叉树

Insertion Binary Tree

您好,我正在阅读二叉树中的值插入,但我发现很难理解使用 Java 的树的递归遍历。 这是代码:

// Java program to insert element in binary tree 
import java.util.LinkedList; 
import java.util.Queue; 
public class GFG { 

/* A binary tree node has key, pointer to  
left child and a pointer to right child */
static class Node { 
    int key; 
    Node left, right; 

    // constructor 
    Node(int key){ 
        this.key = key; 
        left = null; 
        right = null; 
    } 
} 
static Node root; 
static Node temp = root; 

/* Inorder traversal of a binary tree*/
static void inorder(Node temp) 
{ 
    if (temp == null) 
        return; 

    inorder(temp.left); 
    System.out.print(temp.key+" "); 
    inorder(temp.right); 
} 

/*function to insert element in binary tree */
static void insert(Node temp, int key) 
{ 
    Queue<Node> q = new LinkedList<Node>(); 
    q.add(temp); 

    // Do level order traversal until we find 
    // an empty place.  
    while (!q.isEmpty()) { 
        temp = q.peek(); 
        q.remove(); 

        if (temp.left == null) { 
            temp.left = new Node(key); 
            break; 
        } else
            q.add(temp.left); 

        if (temp.right == null) { 
            temp.right = new Node(key); 
            break; 
        } else
            q.add(temp.right); 
    } 
} 

// Driver code 
public static void main(String args[]) 
{ 
    root = new Node(10); 
    root.left = new Node(11); 
    root.left.left = new Node(7); 
    root.right = new Node(9); 
    root.right.left = new Node(15); 
    root.right.right = new Node(8); 

    System.out.print( "Inorder traversal before insertion:"); 
    inorder(root); 

    int key = 12; 
    insert(root, key); 

    System.out.print("\nInorder traversal after insertion:"); 
    inorder(root); 
} 
}

谁能解释一下这个 inorder() 方法是如何工作的?根据我的说法,它永远不应该终止,因为它会一次又一次地传递空值,并且 if 循环中的 return 语句只会循环出循环而不是整个方法。

inorder 正在调用 recursively

在任何给定的方法调用中,我们首先传入树的左节点,然后传入右节点。然后,这些调用将调用左节点或右节点的方法,但是 - 如果该节点为空,它会提前 returns。树不是无限的——所以在某一点上,节点的左右节点必须为空,此时方法 returns 提前并且不会继续。因此,递归在某些时候被安全地破坏了。

此外 if 不是循环 - 它是条件语句。在整个方法的 if returns 中调用 return 并且不只是超出 if 语句。你一定把它和 break.

混淆了