当前位置 博文首页 > 强仔不强的博客:龙生九子,各有不同,看这四种二叉树如何各显神

    强仔不强的博客:龙生九子,各有不同,看这四种二叉树如何各显神

    作者:[db:作者] 时间:2021-09-22 22:42

    完全二叉树

    对于高度为k的,有n个节点的二叉树,当且仅当其每个节点都与高度为k的满二叉树中编号从1~n的节点一一对应时称为完全二叉树
    在这里插入图片描述

    判断完全二叉树

    需要用到队列

    1. 判断root是否为空,如果root不为空,将其入队
    2. 出队头元素,判断其是否为空;
    3. 如果此节点为空的话,依次出队中元素,如果有非空的节点,则说明此二叉树是非完全二叉树;如果都是出队的节点都为空的话,则说明是完全二叉树。
    4. 如果此节点不为空,将其左树的根节点及右树的根节点(null也要入队)依次入队,在进入第2步循环
      记清入队顺序
        public boolean isCompleteTree2(Node root){
            if(root == null){
                return true;
            }
            Queue<Node> queue = new LinkedList<>();
            queue.offer(root);
            while(true) {
                Node top = queue.poll();
                if (top == null) {
                    while(!queue.isEmpty()) {
                        if(queue.poll() != null){
                            return false;
                        }
                    }
                    return true;
                } else {
                    queue.offer(top.left);
                    queue.offer(top.right);
                }
            }
        }
    

    平衡二叉树

    每个节点的左树和右树的高度差<=1
    如果一棵树为平衡二叉树,那么这棵树的每棵子树都是平衡二叉树

    判断平衡二叉树

    1. 获取根节点左树的高度,及右树的高度,就算绝对值,如果结果>1,毫不客气直接返回false;如果结果<=1,说明此节点是平衡的
    2. 继续判断根的左树和右数
        public int Hight(Node root){
            if(root == null){
                return 0;
            }
            int left = Hight(root.left);
            int right = Hight(root.right);
            return ((left > right) ? left : right) +1;
        }
        public boolean isBalanced(Node root){
            if(root == null){
                return true;
            }
            int leftHight = Hight(root.left);
            int rightHIght = Hight(root.right);
            if(Math.abs(leftHight - rightHIght) >1 ){
                return false;
            }
            return isBalanced(root.left) && isBalanced(root.right);
        }
    

    此代码时间复杂度O(n^2)

    下面这个代码的时间复杂度为O(n^2)
    即在求二叉树高度的时候就判断是否是平衡二叉树
    在这里插入图片描述
    root为E的方法中,leftHight = 0,rightHight = 2,直接返回 -1;
    即root为B的方法中,leftHight = 1;rightHight = -1;直接返回-1;

        public int Hight(Node root){
            if(root == null){
                return 0;
            }
            int leftHight = Hight(root.left);
            int rightHight = Hight(root.right);
            if(leftHight == -1 || rightHight == -1 || Math.abs(leftHight - rightHight) > 1){
                return -1;
            }
            return (leftHight > rightHight ? leftHight : rightHight) + 1;
        }
        public boolean isBalanced(Node root){
            if(Hight(root) != -1){
                return true;
            }
            return false;
        }
    

    对称二叉树

    对称二叉树
    在这里插入图片描述

    非对称二叉树
    在这里插入图片描述

    判断对称二叉树

    1. 首先建立一个子方法,判断root的左节点和右节点是否对称(俩个节点都为空,或两个节点的值相同)
    2. 如果两个节点对称的话,判断左节点.left 和 右节点.right 以及左节点.right 和 右节点.left 是否对称
    3. 递归
        public boolean isSymmeticChild(Node leftroot , Node rightroot){
            if(leftroot == null && rightroot == null){
                return true;
            }
            if(leftroot == null || rightroot == null){
                return false;
            }
            if(leftroot.getVal() != rightroot.getVal()){
                return false;
            }
            return isSymmeticChild(leftroot.right , rightroot.left) && isSymmeticChild(leftroot.left , rightroot.right);
        }
        public boolean isSymmetric(Node root){
            if(root == null){
                return true;
            }
            return isSymmeticChild(root.left,root.right);
        }
    

    镜像二叉树

    写出一个二叉树的镜像二叉树

        public Node Mirror (Node root){
            if(root == null){
                return root;
            }
            if(root.left == null && root.right == null){
                return root;
            }
            Node temp = root.left;
            root.left = root.right;
            root.right = temp;
            root.left = Mirror(root.left);
            root.left = Mirror(root.right);
            return root;
        }
    
    cs
    下一篇:没有了