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

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

对称二叉树


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];
    }
}



相关文章
|
6月前
|
算法 程序员
【算法训练-二叉树 二】【重建二叉树】依据前序与中序遍历序列重建二叉树
【算法训练-二叉树 二】【重建二叉树】依据前序与中序遍历序列重建二叉树
65 0
|
6月前
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
二叉树基础oj练习(对称二叉树、翻转二叉树、另一棵树的子树二叉树的构建及遍历)
41 0
|
6月前
|
Java C++ 索引
leetcode-106:从中序与后序遍历序列构造二叉树
leetcode-106:从中序与后序遍历序列构造二叉树
49 0
【LeetCode】105. 从前序与中序遍历序列构造二叉树
题目描述: 给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。 示例:
61 0
|
6月前
|
C++ 索引 Python
leetcode-105:从前序与中序遍历序列构造二叉树
leetcode-105:从前序与中序遍历序列构造二叉树
46 0
|
11月前
|
C++ 索引
从前序与中序遍历序列构造二叉树(C++实现)
从前序与中序遍历序列构造二叉树(C++实现)
87 1
|
11月前
|
算法
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
每日一题:LeetCode-589.N叉树的前序遍历序列构造二叉树
|
C++
力扣 - 106、从中序与后序遍历序列构造二叉树
力扣 - 106、从中序与后序遍历序列构造二叉树
102 0
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树
134 0
【LeetCode】-- 105. 从前序与中序遍历序列构造二叉树