• 找到二叉树中符合搜索二叉树条件的最大拓扑结构-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. */
  • 相关阅读:
    Vue3.0路由拦截
    QPainter绘制时【数据类型】和【抗锯齿】对效果的影响【2】
    俄罗斯方块
    Servlet之Request&Reponse 学习笔记
    matplotlib显示图表图例
    面试美团测试岗后感想,很后悔这5年来一直都干的是 “基础测试”工作
    Echarts 社区分享
    计算机网络基础02-linux虚拟网络隔离(网桥bridge,路由,虚拟网卡veth)
    ABAP datum_range中的四个组件的作用
    Channel 是什么?
  • 原文地址:https://blog.csdn.net/chimomo/article/details/125473100