• 如何判断一颗二叉树是完全二叉树


    若设二叉树的深度为k,除第k层外,其它各层(1至k-1)的节点数都达到了最大个数,第k层所有的节点都连续几种在最左边,这就是完全二叉树

     

     思路:按照宽度遍历进行改进

    1)在遍历的过程中如果存在任何一节点有右节点,无左节点,返回false

    2)在第1个条件成立的情况下,遇到了第一个左右孩子不相全的情况,则接下来遇到的所有节点都必须为叶子节点,如果是返回true,反之false

    代码实现 

    package Algorithms.tree;
    import java.util.LinkedList;
    
    public class IsCBT {
    
        public static class Node {
            public int value;
            public Node left;
            public Node right;
    
            public Node(int data) {
                this.value = data;
            }
        }
    
        //判断二叉树是否为完全二叉树(二叉树宽度遍历改进而来)
        public static boolean isCBT(Node head) {
            if (head == null) {
                return true;
            }
            LinkedList<Node> queue = new LinkedList<>();
            //是否遇到左右两个孩子不双全的节点
            boolean leaf = false;
            Node l = null;
            Node r = null;
            queue.add(head); //1、先把头节点放入队列中
            while (!queue.isEmpty()) {
                head = queue.poll(); // 2、poll出一个Node
                l = head.left;
                r = head.right;
                //poll之后由打印改为判断是否为完全二叉树
                //在遇到不双全的节点后,发现当前节点不是叶子节点。或者一个节点有右节点,没有左节点,返回false
                if ((leaf && (l != null || r != null)) || (l == null && r != null)) {
                    return false;
                }
                if (l != null) { //3、对于弹出的节点,把其左右节点入队列
                    queue.add(l);
                }
                if (r != null) {
                    queue.add(r);
                } else { //如果一个节点左右孩子不双全,把leaf置true
                    leaf = true;
                }
            }
            return true;
        }
    
    }
  • 相关阅读:
    c#函数重载
    (1).net c# 一步一步自己写三层代码生成器(主界面及连接数据库界面)
    C#给datagridview某行赋值(转)
    好的软件人员必看的六十本书
    C# 语言规范
    spring 排除指定的类或者包扫描
    java web spring 发送邮件
    spring-data-redis和jedis版本对应收集总结
    python 多线程和多进程基本写法
    python 调用nmap
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/15132710.html
Copyright © 2020-2023  润新知