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

在java中清除整个二叉树的问题

邴墨竹
2023-03-14

我写了一个关于二叉树的示例代码。向二叉树添加节点和遍历节点都从根节点开始。如果我想清空整个二叉树,我应该怎么做?使用clear1方法还是clear2方法?clear1方法只将根节点设置为null。clear2方法遍历每个节点,然后将每个节点设置为null。看来两者都能达到清理的目的。我不知道两者之间的区别。如果使用clear1,我不知道未设置为null的节点是否会影响垃圾收集

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class BinaryTree<T> {

public int size;

public Node root;

private Queue<Node> queue;

public class Node {
    public T value;
    public Node leftNode;
    public Node rightNode;

    private Node(T value, Node leftNode, Node rightNode) {
        this.value = value;
        this.leftNode = leftNode;
        this.rightNode = rightNode;
    }
}


public void add(T addValue) {
    Node node = new Node(addValue, null, null);
    if (null == root) {
        root = node;
        queue = new LinkedList<>();
        queue.offer(node);
    } else {
        Node queNode = queue.peek();
        if (null == queNode.leftNode) {
            queNode.leftNode = node;
            queue.offer(queNode.leftNode);
        } else if (null == queNode.rightNode) {
            queNode.rightNode = node;
            queue.poll();
            queue.offer(queNode.rightNode);
        }
    }
    size++;
}


/**
 * Postorder Traversal
 */
public List<T> postTraverse() {
    return postTraverse(new ArrayList<>(), root);
}

private List<T> postTraverse(List<T> list, Node node) {
    if (list.size() != size && null != node) {
        postTraverse(list, node.leftNode);
        postTraverse(list, node.rightNode);
        list.add(node.value);
    }
    return list;
}

/**
 * clear Binary Tree method1
 */
public void clear1() {
    queue = null;
    size = 0;
    root = null;
}

/**
 * clear Binary Tree method2
 */
public void clear2() {
    queue = null;
    clear2(root);
    size = 0;
}

private void clear2(Node node) {
    if (null != node) {
        clear2(node.leftNode);
        clear2(node.rightNode);
        node = null;
    }
}
}

测试:

 public static void main(String[] args) {
    BinaryTree<String> binaryTree = new BinaryTree<>();
    binaryTree.add("A");
    binaryTree.add("B");
    binaryTree.add("C");
    binaryTree.add("D");
    binaryTree.add("E");
    binaryTree.add("F");
    binaryTree.add("G");
    binaryTree.add("H");
    binaryTree.add("i");
    binaryTree.add("j");
    binaryTree.add("k");
    binaryTree.add("L");
    binaryTree.add("M");
    binaryTree.add("N");
    binaryTree.add("O");

    System.out.println(binaryTree.postTraverse());
    binaryTree.clear1();
}

共有1个答案

谷梁宁
2023-03-14

使用第一种方法。清除没有任何好处,它只是做了很多无用的工作。

 类似资料:
  • 接受的答案可以做一棵完美的树(这也是一棵完整的树)。虽然它不能在没有完美的情况下做成一棵完整的树。不过,这是我的要求最接近的答案。为了在不完美的情况下进行竞争,你可以去掉树最右边的叶子。 1.问题: 试图将< code >二叉查找树变成< code >完整的二叉查找树。我可以找到很多< code >完全二叉树的代码示例,但是没有< code >完全二叉查找树。这个插件的工作就像二叉查找树应该做的那

  • 我正在研究二叉树。我在网上看到了一个遍历整个二叉树的代码。这是我得到的代码:“” “‘ 我不明白的是这个函数如何打印正确的孩子?根据代码每次调用函数时,左子被打印出来。代码永远不会到达正确的孩子。

  • 我将完整子树定义为所有级别都已满且最后一个级别左对齐的树,即所有节点都尽可能左对齐,我希望找到树中最大的完整子树。 一种方法是对每个节点作为根执行这里概述的方法,这将花费O(n^2)时间。 有更好的方法吗?

  • 我正在尝试用java实现二叉树,下面是我的代码: 我无法在我的树中插入新节点,root的值不会改变 当我调用newnode函数时,我得到了我的Root Node的正确值,但在main函数中,它给了我空点异常 为什么root的值没有更新

  • 我已经在“合并两棵二叉树”上工作了好几个小时了,我不明白为什么我的代码不起作用。树t1被指定为[1,3,2,5],树t2被指定为[2,1,3,null,4,null,7],我必须通过对重叠节点求和并尽可能避免null来合并这两棵树,因此结果应该是[3,4,5,5,4,null,7]。我不是像我应该的那样创建一棵新树,而是重写树t1以获得所需的结果。我的代码如下: 我的代码运行时没有错误,我的最终结

  • 下面给出了二叉树的实现。 如图中所示,树不是完整的二叉树。如何编写一个函数,将上述二叉树转换为完整的二叉树,只需将字符串数据节点添加到没有子节点的节点,即可生成完整的二叉树。 我将手动在代码中添加节点,以获得如下结果树: 但是,如何编写一个函数,它将采取根节点和返回树,这是完整的二叉树。