• 找到二叉树中符合搜索二叉树条件的最大拓扑结构-Java:解法一


    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net

    1. package live.every.day.ProgrammingDesign.CodingInterviewGuide.BinaryTree;
    2. import live.every.day.ProgrammingDesign.CodingInterviewGuide.BinaryTree.BinaryTreePrinterSolution2.Node;
    3. /**
    4. * 找到二叉树中符合搜索二叉树条件的最大拓扑结构
    5. *
    6. * 【题目】
    7. * 给定一棵二叉树的根节点root,已知其中所有节点的值都不一样,返回其中最大的且符合搜索二叉树条件的最大拓扑结构的大小。
    8. *
    9. * 【难度】
    10. * 困难
    11. *
    12. * 【解答】
    13. * 方法一:二叉树的节点数为N,时间复杂度为O(N^2)的方法。
    14. * 首先来看这样一个问题,以节点h为头的树中,在拓扑结构中也必须以h为头的情况下,怎么找到符合搜索二叉树条件的最大结构?这个问题
    15. * 有一种比较容易理解的解法,我们先考查h的孩子节点,根据孩子节点的值从h开始按照二叉搜索的方式移动,如果最后能移动到同一个孩子
    16. * 节点上,说明这个孩子节点可以作为这个拓扑的一部分,并继续考查这个孩子节点的孩子节点,一直延伸下去。
    17. * 也就是说,我们根据一个节点的值,根据这个值的大小,从h开始,每次向左或者向右移动,如果最后能移动到原来的节点上,说明该节点可
    18. * 以作为以h为头的拓扑的一部分。
    19. * 解决了以节点h为头的树中,在拓扑结构也必须以h为头的情况下,怎么找到符合搜索二叉树条件的最大结构?接下来只要遍历所有的二叉树
    20. * 节点,并在以每个节点为头的子树中都求一遍其中的最大拓扑结构,其中最大的那个就是我们想找的结构,它的大小就是我们的返回值。
    21. * 具体过程请参看如下代码中的getMaxTopologyBSTSize方法。
    22. * 对于方法一的时间复杂度分析,我们把所有的子树(N个)都找了一次最大拓扑,每找一次所考查的节点数都可能是O(N)个节点,所以方法
    23. * 一的时间复杂度为O(N^2)。
    24. *
    25. * @author Created by LiveEveryDay
    26. */
    27. public class FindMaxTopologyBSTSizeSolution1 {
    28. public static int getMaxTopologyBSTSize(Node root) {
    29. if (root == null) {
    30. return 0;
    31. }
    32. int max = maxTopo(root, root);
    33. max = Math.max(getMaxTopologyBSTSize(root.left), max);
    34. max = Math.max(getMaxTopologyBSTSize(root.right), max);
    35. return max;
    36. }
    37. private static int maxTopo(Node h, Node n) {
    38. if (h != null && n != null && isBSTNode(h, n, n.data)) {
    39. return maxTopo(h, n.left) + maxTopo(h, n.right) + 1;
    40. }
    41. return 0;
    42. }
    43. private static boolean isBSTNode(Node h, Node n, int data) {
    44. if (h == null) {
    45. return false;
    46. }
    47. if (h == n) {
    48. return true;
    49. }
    50. return isBSTNode(h.data > data ? h.left : h.right, n, data);
    51. }
    52. public static void main(String[] args) {
    53. Node node1 = new Node(5);
    54. Node node2 = new Node(2);
    55. Node node3 = new Node(8);
    56. Node node4 = new Node(1);
    57. Node node5 = new Node(3);
    58. Node node6 = new Node(7);
    59. Node node7 = new Node(6);
    60. node1.left = node2;
    61. node1.right = node3;
    62. node2.left = node4;
    63. node2.right = node5;
    64. node3.left = node6;
    65. node3.right = node7;
    66. System.out.println(getMaxTopologyBSTSize(node1));
    67. }
    68. }
    69. // ------ Output ------
    70. /*
    71. 6
    72. */
  • 相关阅读:
    MLOps最全的资料合集:书籍、课程与博文
    开发QGC时常见的性能瓶颈有哪些,如何使用工具进行性能分析和优化。
    职场人,该看重机遇,还是该注重自己的能力?
    Arduino驱动CMPS12电子罗盘(惯性测量传感器篇)
    LeetCode--102. 二叉树的层序遍历(C++描述)
    简单理解推挽输出和开漏输出
    APP商品详情源数据接口(淘宝/京东/拼多多/苏宁/抖音等平台详情数据分析接口)代码对接教程
    DDD基础_领域设计10大基础概念
    深度学习(二)BERT模型及其一系列衍生模型
    WPS前骨干历时10年打造新型软件,Excel用户:我为此改用WPS
  • 原文地址:https://blog.csdn.net/chimomo/article/details/125473100