Mar.9 最长递增子序列的个数(中等)& 二叉树前中后序和层序遍历(中等)

一、673. 最长递增子序列的个数
在这里插入图片描述
一些名词
最长上升子序列(LIS):Longest Increasing Subsequence
最长连续序列(LCS):Longest Consecutive Sequence
最长连续递增序列(LCIS):Longest Continuous Increasing Subsequence
最长公共子序列(LCS): Longest Common Subsequence
最长公共子串(LPS):Longest Palindromic Substring
这里附上一篇好文:动态规划经典例题——最长公共子序列和最长公共子串(python)

思路

这题是 最长递增子序列的升级版。同样的,用一个dp数组来存放最长递增子序列的长度,这题还需要用一个数组来记录这些序列对应的种数。
在这里插入图片描述

# python3
class Solution:
    def findNumberOfLIS(self, nums: List[int]) -> int:
        dp = list()
        count = list()
        if not nums:
            return 0
        for j in range(len(nums)):
            dp.append(1)
            count.append(1)
            for i in range(j):
                if nums[j] > nums[i]:
                    if dp[i] + 1 > dp[j]:
                        dp[j] = dp[i] + 1
                        count[j] = count[i]
                    elif dp[i] + 1 == dp[j]:
                        count[j] += count[i]
        maxlong = max(dp)
        res = 0
        for i in range(len(nums)):
            if dp[i] == maxlong:
                res += count[i]
        return res

二、二叉树前中后序和层序遍历

144. 二叉树的前序遍历
94. 二叉树的中序遍历
145. 二叉树的后序遍历
102. 二叉树的层序遍历

前中后序
# python3
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def preorder(self, root:TreeNode, res:List) -> List[int]:
        if not root:
            return None
        # 前序
        res.append(root.val)
        self.preorder(root.left, res)
        self.preorder(root.right, res)
        # 中序
        # self.inorder(root.left, res)
        # res.append(root.val)
        # self.inorder(root.right, res)
        # 后序
        #self.postorder(root.left, res)
        #self.postorder(root.right, res)
        #res.append(root.val)

    def preorderTraversal(self, root: TreeNode) -> List[int]:
        res = list()
        self.preorder(root, res)
        return res
层序

在这里插入图片描述

# python3
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root:
            return []
        res = list()
        result = list()
        res.append(root)
        while res:
            n = len(res)
            tmp = list()
            for _ in range(n):
                top = res.pop(0)
                tmp.append(top.val)
                if top.left:
                    res.append(top.left)
                if top.right:
                    res.append(top.right)
            result.append(tmp)
        return result
参考

动态规划解最长子序列子串等一类问题之最长连续递增序列

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个基于指针的二叉树结构和函数实现: ```c #include <stdio.h> #include <stdlib.h> // 二叉树结构体 typedef struct TreeNode { char val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 递归创建二叉树 TreeNode* createTree() { char c; scanf("%c", &c); if (c == '#') { return NULL; } TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = c; root->left = createTree(); root->right = createTree(); return root; } // 叉树 void inorderTraversal(TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); printf("%c ", root->val); inorderTraversal(root->right); } // 后叉树 void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); postorderTraversal(root->right); printf("%c ", root->val); } // 层叉树 void levelOrderTraversal(TreeNode* root) { if (root == NULL) { return; } TreeNode* queue[100]; int front = 0, rear = 0; queue[rear++] = root; while (front < rear) { TreeNode* node = queue[front++]; printf("%c ", node->val); if (node->left != NULL) { queue[rear++] = node->left; } if (node->right != NULL) { queue[rear++] = node->right; } } } int main() { printf("请输入二叉树(#表示空结点):\n"); TreeNode* root = createTree(); printf("结果:"); inorderTraversal(root); printf("\n后结果:"); postorderTraversal(root); printf("\n层结果:"); levelOrderTraversal(root); printf("\n"); return 0; } ``` 这里输入的二叉树以字符串形式输入,例如: ``` 请输入二叉树(#表示空结点): AB#D##CE##F## ``` 这样就会构建出如下的二叉树: ``` A / \ B C \ \ D E \ F ``` 然后分别输出、后和层的结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值