前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每日三题-对称二叉树、从前序与中序遍历序列构造二叉树、不同的二叉搜索树

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

作者头像
才疏学浅的木子
发布2022-11-13 09:37:39
2000
发布2022-11-13 09:37:39
举报
文章被收录于专栏:CSDN文章

👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 算法 🌈 算法类型Hot100题 🌈

每日三题

对称二叉树

在这里插入图片描述
在这里插入图片描述

解法一

递归

代码语言:javascript
复制
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);
    }
}

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

在这里插入图片描述
在这里插入图片描述

解法一

递归 前序遍历是 根 左 右 中序遍历是 左 根 右 我们可以根据前序遍历将中序遍历分为左子树,根,右子树 这又变成根据前序+中序建立一个二叉树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
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;
    }
}

不同的二叉搜索树

在这里插入图片描述
在这里插入图片描述

解法一

动态规划 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]

代码语言:javascript
复制
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];
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 每日三题
  • 对称二叉树
  • 从前序与中序遍历序列构造二叉树
  • 不同的二叉搜索树
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档