左程云算法Day6 图

搜索二叉树(BST):左孩子都比该节点小,右孩子都比该节点大

判断是否为搜索二叉树:改写中序遍历 (中序遍历下必然是递增的),只需要把中序遍历的打印过程改为与当前已检查到的最大值做比较即可判断

public class IsBst {
    public static int preValue=Integer.MIN_VALUE;
    public static boolean isbst(Node head){
        if(head==null){
            return true;
        }
        boolean isLeftBST = isbst(head.left);
        if(!isLeftBST){
            return false;
        }
        if(head.value<=preValue){
            return false;
        }
        else{
            preValue= head.value;
        }
        return(isbst(head.right));
    }
}

判断一颗二叉树为完全二叉树:二叉树按宽度遍历,若遇到一个节点只有右孩子没有左孩子,则可判断其为非完全二叉树;若遇到了第一个左右孩子不双全后,后面遇到的节点全都必须为叶子节点。

import java.util.LinkedList;

/**
 * @author 咕噜大飞侠
 * @version 1.0
 * Create by 22/2/2022 上午9:59
 * 宽度遍历判断完全二叉树
 * 主要思想:完全二叉树中必然存在两种情况:1、任意节点满足有左孩子没有右孩子,
 * 2、第一中情况下,若出现了有左无右的情况,后面所有的节点都必须为叶子节点(没有左节点也没有右节点)
 */


public class isCBT {
    public  static boolean isCBT(Node head){
        if(head==null){
            return true;
        }
        //利用队列来遍历二叉树
        LinkedList queue = new LinkedList();
        boolean flag =false;
        Node l = null;
        Node r = null;
        queue.add(head);
        while(!queue.isEmpty()){
            head = queue.poll();
            l=head.left;
            r=head.right;
            if(flag&&(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){
                    flag = true;
                }
            }
        }

判断一棵树是否为平衡二叉树:利用递归套路。

递归套路:对于设置变量存储自己想要的信息,然后通过这些信息组合判断得出结论。该套路可以解决大部分树型DP的问题(从左树要信息和从右树要信息形成递归)

判断一棵树是否为满二叉树:节点总数为2^depth-1.

public class isF {
    public static boolean isf(Node head){
        if(head==null){
            return true;
        }
        Info all = f(head);
        if(all.nodes==1>>all.height-1){
            return true;
        }
        else{
            return false;
        }
    }

    public static class Info{
        public int height;
        public int nodes;
        public Info(int height,int nodes){
            this.height=height;
            this.nodes =nodes;
        }
    }

    public static Info f(Node x) {
        if (x == null) {
            return new Info(0, 0);
        }
        Info leftData=f(x.left);
        Info rightData=f(x.right);
        int height = Math.max(leftData.height,rightData.height)+1;
        int nodes =leftData.nodes+rightData.nodes+1;
        return new Info(height,nodes);
    }
}

题目:给定两个二叉树的节点node1和node2,求出他们的最低公共祖先节点

分为三种情况:1、A是B的LCA或B是A的LCA;2、A和B互不为LCA,向上遍历才能够找到公共祖先。

题目:在二叉树中找到一个节点的后续节点

 求后继:两种情况:1、x有有右树的时候,x的后继为右数的最左节点

                                 2、x没有右子树时 ,一直往上,直到当前节点是其父亲节点右孩子

二叉树的序列化和反序列化:将内存里一棵树变化为字符串形式,以及将字符串形式变为内存里的树

题目:判断一棵二叉树是另一棵二叉树的子树

题目2:纸折痕题目:把一张纸条竖放在桌面上,然后从纸条的下边向上对折,折出折痕展开。若为凸输出凸,为凹输出凹,根据所给折数由上至下输出所有折痕。(coding题,实为中序遍历)

你可能感兴趣的:(算法,数据结构,排序算法)