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

为什么我们在链表中的一个节点中插入值时需要一个临时节点?

姜俊逸
2023-03-14
import java.util.Scanner;
    public class binary_tree {
private TreeNode root;
private int height = 0;
public static class TreeNode {
    private int data;
    private TreeNode left;
    private TreeNode right;
    public TreeNode(int user_input) {
        this.data = user_input;
    }
}


public void insertNode(TreeNode newnode) { // HERE....I have used only root.

    if (root == null) {
        root = newnode;
        height += 1;
        return;
    }
    if (height % 2 != 0) {
        System.out.println(height);
        while (root.left != null) {
            root = root.left;
        }
        root.left = newnode;
        height += 1;
        return;
    }
    while (root.right != null) {
        root = root.right;
    }
    root.right = newnode;
    height += 1;
}
public void display(TreeNode rootnode) {
    TreeNode temp = rootnode;
    if (temp == null)
        System.out.println("Tree Empty !!!");
    else {
        System.out.println("press 1 for LEFT SUBTREE \npress 2 for RIGHT SUBTREE.");
        Scanner sc = new Scanner(System.in);
        int ch = sc.nextInt();
        while (temp != null) {
            System.out.println(temp.data + " $");
            if (ch == 1)
                temp = temp.left;
            else
                temp = temp.right;
        }
    }
    System.out.println("Height of the tree = " + height);
}
public static void main(String[] args) {
    // TODO Auto-generated method stub
    binary_tree bt = new binary_tree();

    TreeNode newNode = new TreeNode(50);
    bt.insertNode(newNode);

    TreeNode newNode2 = new TreeNode(10);
    bt.insertNode(newNode2);

    TreeNode newNode3 = new TreeNode(100);
    bt.insertNode(newNode3);

    TreeNode newNode4 = new TreeNode(5);
    bt.insertNode(newNode4);

    TreeNode newNode5 = new TreeNode(1000);
    bt.insertNode(newNode5);

    bt.display(bt.root);
}
press 1 for LEFT SUBTREE 
press 2 for RIGHT SUBTREE.
3
10 $
1000 $
Height of the tree = 5
import java.util.Scanner;
public class binary_tree {

private TreeNode root;
private int height = 0;

public static class TreeNode {
    private int data;
    private TreeNode left;
    private TreeNode right;

    public TreeNode(int user_input) {
        this.data = user_input;
    }
}

public void insertNode(TreeNode newnode) {
    TreeNode current_node = root;   //THIS IS THE TEMPORARY NODE    
    if (current_node == null) {
        root = newnode;
        height += 1;
        return;
    }
    if (height % 2 != 0) {
        System.out.println(height);
        while (current_node.left != null) {
            current_node = current_node.left;
        
        }
        current_node.left = newnode;
        height += 1;
        return;
    }
    while (current_node.right != null) {
        current_node = current_node.right;
    }
    current_node.right = newnode;
    height += 1;
}

public void display(TreeNode rootnode) {
    TreeNode temp = rootnode;
    if (temp == null)
        System.out.println("Tree Empty !!!");
    else {
        System.out.println("press 1 for LEFT SUBTREE \npress 2 for RIGHT SUBTREE.");
        Scanner sc = new Scanner(System.in);
        int ch = sc.nextInt();
        while (temp != null) {
            System.out.println(temp.data + " $");
            if (ch == 1)
                temp = temp.left;
            else
                temp = temp.right;
        }
    }
    System.out.println("Height of the tree = " + height);
}

public static void main(String[] args) {
    // TODO Auto-generated method stub
    binary_tree bt = new binary_tree();

    TreeNode newNode = new TreeNode(50);
    bt.insertNode(newNode);

    TreeNode newNode2 = new TreeNode(10);
    bt.insertNode(newNode2);

    TreeNode newNode3 = new TreeNode(100);
    bt.insertNode(newNode3);

    TreeNode newNode4 = new TreeNode(5);
    bt.insertNode(newNode4);

    TreeNode newNode5 = new TreeNode(1000);
    bt.insertNode(newNode5);

    bt.display(bt.root);
}

输出

press 1 for LEFT SUBTREE 
press 2 for RIGHT SUBTREE.
3
50 $
100 $
1000 $
Height of the tree = 5

谁能告诉我这里发生了什么?current_node有什么不同?

共有1个答案

云项禹
2023-03-14

为什么我们在链表中的一个节点中插入值时需要一个临时节点?

因为您正在遍历树的叶子:

while (current_node.left != null) {
    current_node = current_node.left;
}
current_node.left = newnode;
height += 1;

在这几行代码中,您试图找到最左边的叶子,以便插入newnode,对吗?您希望使用一个变量来跟踪当前处于哪个节点上,并通过执行somevariable=somevariable.left;来“向左”。

    50
   /  \
  10  100
    10

在您的程序中实际发生的情况是:它正确地插入50、10和100,然后在添加5时,尝试向下遍历左边的子树。这使得根为“10”,加上5就变成了:

    10
   /
  5

然后正确地添加1000:

    10
   /  \
  5   1000

因此它打印10和1000。

使用全新的变量解决了这个问题,因为全新的变量与root无关。

 类似资料:
  • 问题内容: 在Go标准库中,有一个ConstantTimeByteEq函数,如下所示: 现在,我了解了对恒定时间 字符串 (数组等)进行比较的必要性,因为常规算法可能会在第一个不相等元素之后短路。但是在这种情况下,是否已经将两个固定大小的整数进行常规比较已经不是在CPU级别进行恒定时间的操作了? 问题答案: 不必要。而且很难说出编译器在进行优化后会发出什么信息。对于高级“比较一个字节”,您可能会得

  • 我在这里(有点)了解jdk 5 Reentry antLock的功能 但为什么我们想要一个“再进入者”锁呢?i、 e如果一个线程已经锁定了一个对象,为什么它需要再次获取它?

  • 本文向大家介绍实现双向链表删除一个节点P,在节点P 后插入一个节点,写出这两个函数。相关面试题,主要包含被问及实现双向链表删除一个节点P,在节点P 后插入一个节点,写出这两个函数。时的应答技巧和注意事项,需要的朋友参考一下 【参考答案】

  • 本文向大家介绍为什么我们需要一个数据库,包括了为什么我们需要一个数据库的使用技巧和注意事项,需要的朋友参考一下 数据库是数据的集合,通常以电子形式存储。数据库的设计通常是为了使其易于存储和访问信息。 好的数据库对任何公司或组织都至关重要。这是因为数据库存储了有关公司的所有相关详细信息,例如员工记录,交易记录,工资详细信息等。 数据库重要的各种原因是- 管理大量数据 数据库每天存储和管理大量数据。使

  • 我在做一个程序,没有使用Java的内置链表类;我在从头开始做。除了编写一个将节点插入链表的特定位置的方法外,我在所有方面都取得了成功。 我有一个方法将一个特定的节点设置为“当前”节点。所以,例如,我有一个链表,看起来是这样的:猫-->狗-->使-->好-->宠物,“当前”等于2;这意味着“当前”节点是“狗”。 从这里开始,假设我想在“current”的位置插入一个新节点,它的info字段为AND。

  • 我写了一个循环双链接列表,前面有一个虚拟节点。在初始化DLL类的过程中,我创建了虚拟节点。当我在jGrasp中使用调试器并使用可视化工具时,在插入几个数字后,我的虚拟节点会四处移动,不会停留在最前面。我不明白我是如何修改我的链表的。作为前言,我的节点类有一个整数val和两个名为prev和next的指针。我注意到的一件事是,在赋值语句curr=dummy之后,dummy节点被洗牌到上一次插入的cur