解题:本质上还是根据数组构建二叉树
第一题只要求求出不同二叉树的个数,第二个题要求求出所有二叉树。
第一题解法:数学公式法
G(1)代表一个节点能构成的二叉搜索树
G(2)表示两个节点能构成的二叉搜索树 G(2)=G(0)* G(1)+G(1)* G(0)
G(0)=1 所以G(2)=2
以此类推就可以得到所有的二叉树种类
这道题的解法就是一个数学公式而已
var numTrees = function(n) {
let arr=[]
arr[0]=1
arr[1]=1
for(let i=2;i<=n;i++){
for(let j=0;j<i;j++){
arr[i]+=arr[j]*arr[i-j-i]
}
}
return arr[n]
}
第二题解法:从普通构造二叉树上提升了一个维度
第二题要求求出每一个具体的二叉搜索树
本质上还是根据一个数组来构造二叉树,与前面的题不同的是,这个数组的每一个节点都可以作为根节点
这道题就是构造二叉树的提升,通过每一个节点都可以当根节点(增加了一层循环),所以返回的左右子树自然而然也就是一个数组了
var generateTrees = function(n) {
function back(left,right){
let res=[]
if(left>right){
//为了处理叶子节点
res.push(null)
return res
}
for(let i=left;i<=right;i++){
//得到左子树数组
let leftArr=back(left,i-1)
//得到右子树数组
let rightArr=back(i+1,right)
//循环得到的左右子树数组,然后遍历,并创建节点
for(let item of leftArr){
for(let rItem of rightArr){
//构造根节点
let node=new TreeNode(i)
node.left=item
node.right=rItem
res.push(node)
}
}
}
return res
}
return back(1,n)
}
总结
普通的构造二叉树题:
105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)
106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)
通过链表来构造二叉树:
109. 有序链表转换二叉搜索树 - 力扣(LeetCode)(2种解法)
提升版的构造二叉树:
95. 不同的二叉搜索树 II - 力扣(LeetCode)
数学公式版本求构造的二叉树的总数:
96. 不同的二叉搜索树 - 力扣(LeetCode)
构造二叉树的反向题:从二叉构造数----->链表
114. 二叉树展开为链表 - 力扣(LeetCode)(3种解法)