不同的二叉搜索树
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
- 思路分析:
遍历每个整数i
作为根节点,由二叉搜索定义知,则左子树包含[1,2,...,i-1]
,右子树包含[i+1,i+2,......,n]
,接着我们以同样的方式递归建立左右子树。- 令
build(i)
,即为以整数i作为根节点的所建立的二叉搜索树;
- 令
则有如下:
build(i)=build(i-1)+build(n-i);
上式显然涉及重复计算,故可使用记忆化降低复杂度
验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
- 思路分析:
由题意知,当前节点root,其存在一个范围限制root->val的大小,故可设置一个递归方法check(root,low,high)
,其中有low<root->val<high
,所有节点满足上述条件才为二叉搜索树。
- 递归结束判断
- 若
root==nullptr
,显然满足上述条件,return true; - 若
root不满足上述区间
,则return false; - 递归的检验
root->left、root->right
- 若
对称二叉树
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的
1
/ \
2 2
\ \
3 3
思路分析
对于一个二叉树镜像对称,即其左右子树是完全镜像翻转的,故我们可以设置checkMirror(p,q)
,两个指针同时移动来遍历左右子树,以判断其是否是镜像翻转。