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

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

作者: yaco | 来源:发表于2020-04-08 10:02 被阅读0次

题目

二叉树的拓扑结构概念:任何经过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));
    }

相关文章

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

    题目 二叉树的拓扑结构概念:任何经过left和right指针,连成一片的节点,都叫一个拓扑结构。只要可以连在一起,...

  • 二叉树

    查找二叉树中最大的搜索二叉树拓扑结构 96.不同的二叉搜索树给定n,求可以构成多少种二叉搜索树 95. 不同的二叉...

  • 算法学习

    数据结构学习笔记:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算算法学习笔记浅谈...

  • Go语言数据结构和算法-BinarySearchTree(二叉搜

    Go语言数据结构和算法-BinarySearchTree(二叉搜索树) 二叉搜索树的数据结构 Insert(val...

  • 3. 二叉搜索树 --- BST(Binary Search T

    BST : 二叉搜索树 树表结构查找相关算法 主要思想 : 循关键码访问 key 条件 : 关键码之间大小比较...

  • 数据结构-二叉搜索树

    数据结构-二叉搜索树(BST) 定义:二叉搜索树是一个节点类的二叉树数据结构,包含以下特点: -左子树仅包含比根节...

  • 二叉搜索树

    二叉搜索树 图解二叉树搜索算法图解:二叉搜索树算法二叉查找树(Binary Search Tree),(又:二叉搜...

  • 数据结构之「二叉搜索树」

    二叉搜索树 二叉搜索树也叫二叉查找树或者二叉排序树,它要么是一颗空树,要么满足以下几点:1.若任意节点的左子树不空...

  • 二叉搜索树

    二叉搜索树 定义 一棵二叉搜索树需要满足以下条件: 是一棵二叉树 对于树中任意节点,所有左子树元素都小于该节点,所...

  • 如何在Java中实现二叉搜索树

    二叉搜索树或BST是一种流行的数据结构,用于保持元素的顺序。二叉搜索树是二叉树,其中左子节点的值小于或等于父节点,...

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/ecezphtx.html