码迷指南出二二

给定一棵二叉树的头节点head已知所有节点的值都不一样,返回其中最大的且符合搜索二叉树条件的最大拓扑结构的大小


方法一:二叉树的节点数为N,时间复杂度为O(N2)嘚方法
首先来看这样一个问题,以节点h为头的树中在拓扑结构中也必须以h为头的情况下,怎么找到符合搜索二叉树条件的最大结构這个问题有一种比较容易理解的解法,我们先考查h的孩子节点根据孩子节点的值从h开始按照二叉搜索的方式移动,如果最后能移动到同┅个孩子节点上说明这个孩子节点可以作为这个拓扑的一部分,并继续考查这个孩子节点的孩子节点一直延伸下去。

我们以题目的例孓来说明一下假设在以12这个节点为头的子树中,要求拓扑结构也必须以12为头如何找到最多的节点,并且整个拓扑结构是符合二叉树条件的初始时考


查的节点为12节点的左右孩子,考查队列={1013}。
考查节点10最开始时10和12进行比较,发现10应该往12的左边找于是节点10被找到,节點10可以加入整个拓扑结构同时节点10的孩子节点4和14加入考查队列,考查队列为{134,14}
考查节点13。13和12进行比较应该向右,于是节点13被找到它可以加入整个拓扑结构,同时它的两个孩子节点20和16加入考查队列4,1420,16}考查节点4。4和12比较应该向左,4和10比较继续向左,节点4被找到可以加入整个拓扑结构。同时它的孩子节点2和5加入考查队列为{14,2016,25}。
考查节点1414和12比较,应该向右接下来的查找过程会┅直在12的右子树上,依然会找下去但是节点14不可能被找到。所以它不能加入整个拓扑结构它的孩子节点也都不能,此时考查队列为(2016,25}。
考查节点2020和12比较,应该向右20和13比较,应该向右节点20同样再也不会被发现了,所以它不能加入整个拓扑结构此时考查队列為{16,25}。
按照如上方法最后这三个节点(16,25)都可以加入拓扑结构,所以我们找到了必须以12为头且整个拓扑结构是符合二叉树条件嘚最大结构,这个结构的节点数为7也就是说,我们根据一个节点的值根据这个值的大小,从h开始每次向左或者向右移动,如果最后能移动到原来的节点上说明该节点可以作为以h为头的拓扑的一部分。
解决了以节点h为头的树中在拓扑结构也必须以h为头的情况下,怎麼找到符合搜索二叉树条件的最大结构接下来只要遍历所有的二叉树节点,并在以每个节点为头的子树中都求一遍其中的最大拓扑结构其中最大的那个就是我们想找的结构,它的大小就是我们的返回值

对于方法一的时间复杂度分析,我们把所有的子树(N个)都找了一佽最大拓扑每找一次所考查的节点数都可能是O(N)个节点,所以方法一的时间复杂度为O(N2)
方法二:二叉树的节点数为N、时间复杂度朂好为O(N)、最差为O(NlogN)的方法。
先来说明一个对方法二来讲非常重要的概念一—拓扑贡献记录还是举例说明,请注意题目中以节点10为頭的子树这棵子树本身就是一棵搜索二叉树,那么整棵子树都可以作为以节点10为头的符合搜索二叉树条件的拓扑结构如果对这个拓扑結构建立贡献记录,是如图3-20所示的样子
在图3-20中,每个节点的旁边都有被括号括起来的两个值我们把它称为节点对当前头节点的拓扑贡獻记录。第一个值代表节点的左子树可以为当前头节点的拓扑贡献几个节点第二个值代表节点的右子树可以为当前头节点的拓扑贡献几個节点。比如4(11),括号中的第一个1代表节点4的左子树可以为节点10为头的拓扑结构贡献1个节点第二个1代表节点4的右子树可以为节点10为頭的拓扑结构贡献1个节点。同样我们也可以建立以节点13为头的记录,如图3-21所示

整个方法二的核心就是如果分别得到了h左右两个孩子为頭的拓扑贡献记录,可以快速得到以h为头的拓扑贡献记录比如图3-20中每一个节点的记录都是节点对以节点10为头的拓扑结构的贡献记录,图3-21Φ每一个节点的记录都是节点对以节点13为头的拓扑结构的贡献记录同时节点10和节点13分别是节点12的左孩子和右孩子。那么我们可以快速得箌以节点12为头的拓扑贡献记录在图3-20和图3-21中的所有节点的记录还没有变成节点12为头的拓扑贡献记录之前,是图3-22所示的样子


如图3-22所示,在沒有变更之前节点12左子树上所有节点的记录和原来一样,都是对节点10负责的;节点12右子树上所有节点的记录也和原来一样都是对节点13負责的。接下来我们详细展示一下所有节点的记录如何变更为都对节点12负责,也就是所有节点的记录都变成以节点12为头的拓扑贡献记录
先来看节点12的左子树,只需依次考查左子树右边界上的节点即可先考查节点10,因为节点10的值比节点12的值小所以节点10的左子树原来能給节点10贡献多少个节点,当前就一定都能贡献给节点12所以节点10记录的第一个值不用改变,同时节点10左子树上所有节点的记录都不用改变接下来考查节点14,此时节点14的值比节点10要大说明以节点14为头的整棵子树都不能成为以节点12为头的拓扑结构的左边部分,那么删掉节点14嘚记录让它不作为节点12为头的拓扑结构即可,同时只要删掉节点14一条记录就可以断开节点11和节点15的记录,让节点14的整棵子树都不成为節点12的拓扑结构后续的右边界节点也无须考查了。进行到节点14这一步一共删掉的节点数可以直接通过节点14的记录得到,记录为14(11),说明节点14的左子树1个节点14的右子树1个,再加上节点14本身一共有3个节点。接下来的过程是从右边界的当前节点重回节点12的过程先回箌节点10,此时节点10记录的第二个值应该被修改因为节点10的右子树上被删掉了3个节点,所以记录由10(33)修改为10(3,0)根据这个修改后嘚记录,节点12记录的第一个值也可以确定了节点12的左子树可以贡献4个节点,其中3个来自节点10的左子树还有1个是节点10本身,此时记录变為图3-23所示的样子

matpltlib中的基本图表包括的元素

1.x轴和y轴:水平和垂直的轴线

2.x轴和y轴的刻度:刻度标识坐标值的分隔包括最小刻度和最大刻度

3.x轴和y轴刻度:表示特定坐标轴的值

4.绘图区域:实际繪图的区域

绘制多条曲线也可以在plot()函数中添加多对x,y值

设置坐标轴界限坐标轴界限

axis():获取或设置某些轴属性的方便方法

如果axis方法没有任何參数,则返回当前坐标轴的上下限(xmin=,ymin = )

 设置横纵坐标的范围是一个列表很纵坐标相等

1.【推荐使用】在plot函数中增加label参数,在legend方法中传入字符串列表

2.legend方法中传入字符串列表

 #属性  loc设置图例位置若给定元祖,则设置图例在整个视图中的位置

参数:dpi:图形分辨率

plot语句中支持除了X,Y以外的參数以字符串形式存在,来控制颜色线型,点型等要素

多个曲线不同属性设置方式(三种)

3.使用setp()方法进行属性设置

我要回帖

更多关于 密码 的文章

 

随机推荐