插入二叉树

时间:2019-04-04 11:34:16

标签: java recursion data-structures binary-tree insertion

嗨,我正在阅读在二叉树中插入值,但是发现使用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()方法如何工作吗?对我来说,它永远不会终止,因为它将继续不断地传递null值,并且if循环内的return语句只会循环出循环而不是整个方法。

1 个答案:

答案 0 :(得分:3)

inorder被称为recursively

在给定的方法调用中,我们首先传递树的左节点,然后传递右节点。然后,这些调用将调用左侧节点或右侧节点的方法,但是-如果该节点为null,则它会提早返回。树不是无限的-因此,在某个点上,节点的左右节点必须为null,这时该方法会提前返回并且不会继续。因此,递归在某些时候被安全地破坏了。

另外if不是循环-这是一个条件语句。在if中调用return会从整个方法返回,而不仅仅是走出if语句。您必须与之混淆的是break