LeetCode之不同的二叉搜索树1和2

138 阅读2分钟

不同的二叉搜索树 I
不同的二叉搜索树 II

image.png

解题:本质上还是根据数组构建二叉树

第一题只要求求出不同二叉树的个数,第二个题要求求出所有二叉树。

第一题解法:数学公式法

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种解法)