用java语言,使用链表带哨兵实现完全二叉树
时间: 2023-08-15 15:10:55 浏览: 50
下面是使用Java语言,使用链表带哨兵实现完全二叉树的示例代码:
```java
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class CompleteBinaryTree {
private TreeNode root;
private int size;
public CompleteBinaryTree() {
root = new TreeNode(0); // 哨兵节点
size = 0;
}
public void add(int val) {
size++;
TreeNode node = new TreeNode(val);
if (size == 1) {
root.left = node;
return;
}
String s = Integer.toBinaryString(size);
TreeNode cur = root.left;
for (int i = 1; i < s.length() - 1; i++) {
if (s.charAt(i) == '0') {
cur = cur.left;
} else {
cur = cur.right;
}
}
if (s.charAt(s.length() - 1) == '0') {
cur.left = node;
} else {
cur.right = node;
}
}
public void traversal() {
if (size == 0) {
System.out.println("The tree is empty!");
return;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root.left);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
System.out.print(node.val + " ");
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
System.out.println();
}
public static void main(String[] args) {
CompleteBinaryTree tree = new CompleteBinaryTree();
tree.add(1);
tree.add(2);
tree.add(3);
tree.add(4);
tree.add(5);
tree.add(6);
tree.add(7);
tree.traversal(); // 输出:1 2 3 4 5 6 7
}
}
```
在这个实现中,我们使用了哨兵节点,作为根节点的父亲节点。每次添加元素时,我们都可以通过二进制表示当前节点的编号,然后从根节点开始向下遍历,找到这个节点的父亲节点,并将新节点插入到父亲节点的左子节点或右子节点。
在输出二叉树时,我们使用了广度优先搜索,使用队列来存储每一层的节点,依次访问每个节点,并将其左右子节点加入队列中,直至队列为空。