Java 向二叉树中第一个未占用的叶添加元素

Java 向二叉树中第一个未占用的叶添加元素,java,heap,binary-tree,breadth-first-search,binary-heap,Java,Heap,Binary Tree,Breadth First Search,Binary Heap,现在我正试图用Java编写一个二叉树结构上实现的二叉堆,虽然我对如何在添加元素后“heapify”树有很好的理解,但在堆底部查找第一个未占用的叶子的逻辑却让我摸不着头脑 我知道查找第一个未占用的叶子应该是广度优先遍历,但我仍然不知道广度优先遍历算法到底是如何工作的。这就是广度优先搜索第一个空分支(然后插入分支)的样子。请注意,这与深度优先插入基本相同,只是它使用一个队列,深度优先插入使用堆栈 void breadthFirstInsert(Node root, Object obj) {

现在我正试图用Java编写一个二叉树结构上实现的二叉堆,虽然我对如何在添加元素后“heapify”树有很好的理解,但在堆底部查找第一个未占用的叶子的逻辑却让我摸不着头脑


我知道查找第一个未占用的叶子应该是广度优先遍历,但我仍然不知道广度优先遍历算法到底是如何工作的。

这就是广度优先搜索第一个空分支(然后插入分支)的样子。请注意,这与深度优先插入基本相同,只是它使用一个队列,深度优先插入使用堆栈

void breadthFirstInsert(Node root, Object obj) {
    Queue<Node> queue = new LinkedList<>();
    queue.offer(root);
    while(!queue.isEmpty()) {
        Node temp = queue.poll();
        if(temp.left != null) {
            queue.offer(temp.left);
        } else {
            temp.left = new Node(obj);
            return;
        }
        if(temp.right != null) {
            queue.offer(temp.right);
        } else {
            temp.right = new Node(obj);
            return;
        }
    }
}
void breadthFirstInsert(节点根,对象对象对象){
Queue Queue=new LinkedList();
queue.offer(根);
而(!queue.isEmpty()){
Node temp=queue.poll();
如果(左侧温度!=null){
队列报价(临时左侧);
}否则{
左侧温度=新节点(obj);
返回;
}
如果(临时正确!=null){
排队报价(临时权利);
}否则{
右侧温度=新节点(obj);
返回;
}
}
}

谢谢!不过,我有点困惑。由于您只是将新节点添加到临时变量,这是否意味着它不会添加到原始树?它将添加到原始树,因为temp是指向树节点的引用的副本。例如,
Node temp=root;temp.left=新节点(obj)
相当于
root.left=新节点(obj)
<代码>节点温度=根;温度=左侧温度;temp.right=新节点(obj)相当于
root.left.right=新节点(obj)