101-对称二叉树
要保证对称,从2边同时向下同步寻找值
104-二叉树的最大深度
先看这个点是不是叶节点,如果是的话,那么比较最大值,不是的话继续深搜
145-二叉树的后序遍历
这题的题解还是比较详细的,主要要弄懂递归的思路是什么,以及nullptr要在什么时候插入,为何插入进行了解。先了解先序递归的套路,再想后序递归会简单很多。
105-从前序与中序遍历中构建二叉树
这里的bulidtree中参数传了TreeNode*&root,表示引用,我们在这个函数可以修改root,如果不引用,root相当于没指引
验证二叉树的前序序列化
看题解才明白怎么做,毕竟我也是新手啊,哭了。
其实只要从左到右遍历,我们仔细观察或者推演一下,一个完全二叉树,最后#个数一定比整数个数大一,并且为了满足每个节点都可以具备完全二叉树的条件,#的数目不能太多,一旦比整数个数多1,那么肯定需要这个string已经遍历到结尾了,如果没有,那么没空间来继续放整数或者#了,所以这是一个false条件。其他得没啥。
二叉树的层序遍历
这题其实和访问最深深度差不多的思想,前序遍历,哪一层入那一层的vector
这题有个vector的resize函数,表示重新设置vector的长度,这题用这个函数好很多。
中序遍历,找值,找到值放进map,如果里面有target-值,那么flag为true,不用剪枝,不会超时。
236-二叉树的最近公共祖先
对于任何一个结点,都可以看成是以该结点为root的树,所以可以递归,要找最近公共祖先,如果p,q在两边,则返回root,如果,只有一边有,另一边没有,则返回有的那一边,不断返回,直到返回到两边都有时,返回根。
543-二叉树的直径
直径要由左子树最深深度和右子树最深深度加起来。
所以我们要定义一个dfs返回最深深度,并且在递归中记录最大直径。
124-二叉树的最大路劲和
刚开始想到了树形DP,和树形DP很像,但是构建不出树来,所以放弃了
我们从第2个图看,最大值可能由-10作为连接点,连接左右子树,也可能知识单个子树的最大值。那么我们只要记录这两个值,比较最大值,就可以得到。dfs,返回调一个子树的最大值,比如-10要调用20,那么我们对于20结点,可以选20-15,也可以20-7,我们只要比较这2结点和最大值,就行。那么怎么判断15-20-7这3个结点的最大值,我们需要在遍历20结点时,遍历完左右字数后,将两子树的与结点值求和看一下多大。
87-扰乱字符串
我们从1枚举到length-1,保证每个二叉树的种类都可能被枚举到,如长度5的,有1和4,2和3,3和2,4和1建树的。然后对每个种类,我们再次判断,看看这个类别能不能扰乱,即再次枚举,比如1和4中,1肯定可以,不用扰乱,4我们从1到3枚举,看看能不能再次分开,使得分开的字符串能不能相等,如果排序都不相等,说明字符串不能以这个种类分,false,直到最后分到最后是s1==s2时,返回true,中途一旦有个地方字符串分开导致,左右子树的字符串不相等,都会false。只有不断保证左右子树的字符串排序后相等,才能是扰乱的字符串。
117-填充每个结点的下一个右侧结点的指针
扫描一行时,用tail指针不断的将一行的所有结点的所有子结点连起来,然后,当我们一行扫完后,我们用dummy指针来维护下一行的起始节点,定义一个dummy结点,再将该节点赋值给tail结点,这样tail和dummy指向的是同一个地方,所以维护了dummy的值。
99-恢复二叉搜索树
二叉搜索树的特点是中序遍历会得到排序,这里交换2个数字相当于把原来得排序扰乱了,可以开个vector进行存储值,然后找到这2个扰乱得值,进行交换就可。
当然也可以迭代遍历,用栈模拟递归。不断先找左子树,找完就把根点遍历,遍历完就再遍历右子树。这里的如果head->right为NULL时,相当于一个树的左结点全部遍历结束,然后root=NULL,这是,在栈中拿出根结点,遍历。
337-打家劫舍
经典得树形DP题目,不过这边用树,我们用dp有点麻烦,直接dfs,用pair得2个值来记录这个取不取的情况
以上就是树结构的AcWing的所有题解了,尽量自己先思考一遍,不会看题解。