左神算法笔记———满足二叉搜索树的最大拓扑结构的大小

题目

二叉树的拓扑结构概念:任何经过left和right指针,连成一片的节点,都叫一个拓扑结构。只要可以连在一起,都叫拓扑结构,区别与前一题的最大而二叉搜索子树。

给定一棵二叉树的头节点head,请返回满足二叉搜索树条件的最大拓扑结构的大小。

分析

  • 首先计算出以包含根节点的最大二叉搜索树的大小,实现方法可以遍历树中的各个节点,然后看根节点按照二叉搜索树的顺序是否可以走到这里来,如果可以,那么当前节点在二叉树结构中
  • 然后计算出左子树包含的最大拓扑结构以及右子树的最大拓扑结构,比较出最大的值,返回即可。

代码

    // 定义Node节点
    public static class Node{
        public int value;
        public Node left;
        public Node right;

        public Node(int data) {
            this.value=data;
        }
    }

    //***************************************解法一********************************************************
    // 定义主函数入口
    public static int getMaxSize(Node root) {
        // 如果当前的root为null,直接返回0
        if(root == null) return 0;
        // 计算以当前root为根节点的最大拓扑二叉搜索树的大小
        int max = maxTuoSize(root,root);
        // 递归进入计算左子树的过程,与原始的max进行比较
        max = Math.max(max,getMaxSize(root.left));
        // 递归进入计算右子树的过程,与更新的max进行比较
        max = Math.max(max,getMaxSize(root.right));
        // 返回结果
        return max;
    }

    // 获取以root为根节点的最大拓扑结构(该拓扑树一定包含root节点)
    private static int maxTuoSize(Node root, Node cur) {
        // 如果当前的cur在以root为根节点的搜索二叉树中
        if(cur != null && isBSTNode(root,cur)) {
            // 左边的结果加中间的结果再加1
            return maxTuoSize(root,cur.left) + maxTuoSize(root,cur.right) + 1;
        }
        return 0;
    }

    // 检查cur节点是否存在于以root为根节点的搜索二叉树中
    private static boolean isBSTNode(Node root, Node cur) {
        if(root == null) {
            return false;
        }
        if(cur == root) {
            return true;
        }
        return isBSTNode(root.value > cur.value ? root.left : root.right, cur);
    }

    //######################以下为测试集#############################

    // for test -- print tree
    public static void printTree(Node head) {
        System.out.println("Binary Tree:");
        printInOrder(head, 0, "H", 17);
        System.out.println();
    }

    public static void printInOrder(Node head, int height, String to, int len) {
        if (head == null) {
            return;
        }
        printInOrder(head.right, height + 1, "v", len);
        String val = to + head.value + to;
        int lenM = val.length();
        int lenL = (len - lenM) / 2;
        int lenR = len - lenM - lenL;
        val = getSpace(lenL) + val + getSpace(lenR);
        System.out.println(getSpace(height * len) + val);
        printInOrder(head.left, height + 1, "^", len);
    }

    public static String getSpace(int num) {
        String space = " ";
        StringBuffer buf = new StringBuffer("");
        for (int i = 0; i < num; i++) {
            buf.append(space);
        }
        return buf.toString();
    }

    public static void main(String []args) {
        //System.out.println("Hello");
        Node node=new Node(12);
        node.left=new Node(10);
        node.right=new Node(13);
        node.left.left=new Node(4);
        node.left.right=new Node(14);
        node.right.left=new Node(20);
        node.right.right=new Node(16);
        node.left.left.left=new Node(2);
        node.left.left.right=new Node(5);
        node.left.right.left=new Node(11);
        node.left.right.right=new Node(15);
        printTree(node);

        System.out.println(getMaxSize(node));
        //System.out.println(getMaxSize2(node));
    }

你可能感兴趣的:(左神算法笔记———满足二叉搜索树的最大拓扑结构的大小)