每日三题-对称二叉树、从前序与中序遍历序列构造二叉树、不同的二叉搜索树

简介: 每日三题对称二叉树从前序与中序遍历序列构造二叉树不同的二叉搜索树

对称二叉树


e4cccf8f878348478a5e8dcaf0e49e95.png解法一

递归

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null) return true;
        return fun(root.left,root.right);
    }
    public boolean fun(TreeNode left,TreeNode right){
        if(left == null && right != null) return false;
        if(right == null && left != null) return false;
        if(left == null && right == null) return true;
        if(right.val != left.val) return false;
        return fun(left.left,right.right)&&fun(left.right,right.left);
    }
}


从前序与中序遍历序列构造二叉树


6b9a9507fe764be7ac1e98f92be57782.png

解法一

递归

前序遍历是 根 左 右

中序遍历左 根 右

我们可以根据前序遍历将中序遍历分为左子树,根,右子树

这又变成根据前序+中序建立一个二叉树

459ba245aa1e4102b8dae7aac25bf9c3.png41445b06f834451683b83b192c3329a5.png

class Solution {
    HashMap<Integer,Integer> map = new HashMap<>();
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        for(int i = 0;i < inorder.length;i++){
            map.put(inorder[i],i);
        }
        return dfs(preorder,inorder,0,preorder.length-1,0,inorder.length-1);
    }
    public TreeNode dfs(int [] preorder,int []inorder,int left1,int right1,int left2,int right2){
        if(left1 > right1 && left2 > right2) {
            return null;
        }
        TreeNode node = new TreeNode(preorder[left1]);
        int i = map.get(preorder[left1]);
        node.left = dfs(preorder,inorder,left1+1,left1+i-left2,left2,i-1);
        node.right = dfs(preorder,inorder,left1+i-left2+1,right1,i+1,right2);
        return node;
    }
}


不同的二叉搜索树


296d6c677aa54b57807e70c2aeb10161 (1).png

解法一

动态规划

1~n

F(i,n)表示以i为根节点,长度为n的不同树的个数

dp[n] 表示长度为n的不同树的个数

dp[n] = F(1,n)+f(2,n)+…+f(n,n)

f(i,n) = dp[i-1]*dp[n-i]

dp[n] = dp(0)*dp[n-1]+dp[1]*dp[n-2]…+dp[n-1]*dp[0]

class Solution {
    public int numTrees(int n) {
        int dp[] = new int[n+1];
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2;i <= n; i++){
            for(int j = 1;j <= i;j++){
                dp[i] += dp[j-1]*dp[i-j];
            }
        }
        return dp[n];
    }
}



相关文章
|
7月前
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
42 0
|
7月前
|
Java C++ 索引
leetcode-106:从中序与后序遍历序列构造二叉树
leetcode-106:从中序与后序遍历序列构造二叉树
50 0
【LeetCode】105. 从前序与中序遍历序列构造二叉树
题目描述: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例:
62 0
|
2月前
|
存储 索引 Python
从中序与后序遍历序列构造二叉树
【10月更文挑战第13天】这段内容介绍了一种基于中序和后序遍历序列构建二叉树的方法。通过识别后序遍历中的根节点,并利用中序遍历划分左右子树,进而递归构建整棵树。文中提供了具体示例及Python代码实现,并分析了该方法的时间与空间复杂度。
21_从中序与后序遍历序列构造二叉树
21_从中序与后序遍历序列构造二叉树
|
7月前
|
C++ 索引 Python
leetcode-105:从前序与中序遍历序列构造二叉树
leetcode-105:从前序与中序遍历序列构造二叉树
48 0
|
C++ 索引
从前序与中序遍历序列构造二叉树(C++实现)
从前序与中序遍历序列构造二叉树(C++实现)
96 1
|
C++ 索引
从中序与后序遍历序列构造二叉树(C++实现)
从中序与后序遍历序列构造二叉树(C++实现)
84 1
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
|
C++
力扣 - 106、从中序与后序遍历序列构造二叉树
力扣 - 106、从中序与后序遍历序列构造二叉树
103 0