刷题第十二天
1382. 将二叉搜索树变平衡:
先将二叉搜索树中序遍历获取有序数组,再将数组根据108的方法转化为平衡二叉树。

669. 修剪二叉搜索树:
如果val小于low,说明区间在右子树,左子树以及当前root直接剪掉,递归左子树,如果val在low和high之间,说明需要修剪左右子树,分别递归。

236. 二叉树的最近公共祖先:
如果root等于p或q,返回root,将p或q向上传递。令l为递归左子树,r为递归右子树,如果lr都为null说明root为根的子树没有p或q,返回null,如果lr其一不为null,返回不为null的子树,继续向上传递,如果lr均不为null,说明pq各在左右子树,root是最近公共祖先,返回root。
235. 二叉搜索树的最近公共祖先:
如果root的值小于pq,递归右子树,如果root的值大于pq递归左子树,否则返回root。

77. 组合:
开始回溯!这题递归,递归参数多加一个开始下标s,设置一个path数组,如果数组长度等于k,说明这是一个答案,存进结果集。设置一个for循环,先将i push进path数组,从i+1开始递归,再pop出path。

216. 组合总和 III:
这题和77有点类似,套用了回溯的模板,尝试写了一下,他要组合总和,所以要有一个地方存当前的sum,我一开始想到的是存在path的末尾。这样终止条件就是path长度为k+1且path.back等于n,递归的参数是k,n和s(从s开始循环)。这样子做是可以的,但是会有频繁的push,pop操作,一不小心就错了。
另外一个思路是,子递归时,应该递归n-i,说明让子递归相加等于n-i就行,这样做的终止条件是n==0,path长度等于k。
