Java队列方法判断是否为完全二叉树

二叉树的种类:

完美二叉树Perfect Binary TreeEvery node except the leaf nodes have two children and every level (last level too) is completely filled. 除了叶子结点之外的每一个结点都有两个孩子,每一层(当然包含最后一层)都被完全填充。
完全二叉树Complete Binary TreeEvery level except the last level is completely filled and all the nodes are left justified. 除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐。
完满二叉树Full/Strictly Binary TreeEvery node except the leaf nodes have two children. 除了叶子结点之外的每一个结点都有两个孩子结点。

 

我们这边用队列的方式,把每个树和孩子树添加到队列,然后每次取该树的头结点去进行操作

public static boolean isCBT(Node node) {
        if (node == null) {
            return true;
        }

        LinkedList<Node> queue = new LinkedList<>();
        boolean leaf = false;
        Node l = null;
        Node r = null;
        queue.add(node);
        while (!queue.isEmpty()) {
            node = queue.poll();
            l = node.left;
            r = node.right;
                                                                  
            if (    //如果遇到不双全的节点之后,又发现了当前节点居然有孩子
                    (leaf && (l != null || r != null))
                            ||
                            (l == null && r != null)//如果只有右节点没有左节点
            ) {
                return false;
            }

            if (l != null) {
                queue.add(l);
            }

            if (r != null) {
                queue.add(r);
            }

            if (l == null || r == null) {//如果左为空或右为空
                leaf = true;
            }
        }
        return true;
    }

要创建完全二叉树,可以使用队列来辅助构建。下面是一个示例的Java代码: ```java // 设置TreeNode为内部类:二叉树的存储结构 private class TreeNode { private T data; // 数据域 private TreeNode left; // 左孩子指针 private TreeNode right; // 右孩子指针 public TreeNode(T data) { this.data = data; } } /** * 利用队列创建完全二叉树 * @param data 节点数据 */ public void add(T data) { if (this.root == null) { this.root = new TreeNode(data); queue.add(this.root); } else { if (!queue.isEmpty()) { TreeNode node = queue.peek(); if (node.left == null) { node.left = new TreeNode(data); queue.add(node.left); } else { // 左子树不为空,直接操作右子树 node.right = new TreeNode(data); queue.add(node.right); // 这时左右子树都不为空了,当前节点出队 queue.poll(); } } } } ``` 上述代码中,首先定义了一个内部类TreeNode,表示二叉树的节点。接着,使用add方法来逐个添加节点,这里使用队列queue来辅助构建完全二叉树。当树为空时,直接创建根节点,并将根节点加入队列。否则,从队列中取出第一个节点,并判断其左子树是否为空。若为空,创建左子节点,并将其加入队列。若左子树不为空,直接操作右子树,并将右子节点加入队列。最后,当左右子树都不为空时,将当前节点出队。完成所有节点的添加后,即可得到一个完全二叉树。 请注意,这只是一个示例的实现方法,具体的实现可能会根据需求而有所变化。如果有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值