📌  相关文章
📜  计算由非递减顺序节点组成的二叉树中的路径(1)

📅  最后修改于: 2023-12-03 14:57:33.911000             🧑  作者: Mango

计算由非递减顺序节点组成的二叉树中的路径

简介

本文将介绍如何计算由非递减顺序节点组成的二叉树中的路径。我们会先解释什么是非递减顺序节点,然后讲解如何计算路径。最后,我们会给出一个示例程序。

什么是非递减顺序节点

在二叉树中,我们将节点的值按照从左到右的顺序从小到大排列,那么这个二叉树就是由非递减顺序节点组成的。

比如下面这棵二叉树:

      2
     / \
    1   3

它就是由非递减顺序节点组成的,因为从左到右的顺序为1、2、3。

如何计算路径

计算由非递减顺序节点组成的二叉树中的路径可以使用动态规划的思想。设dp[i][j]表示以第i个节点为结尾,从根节点到第j个节点的路径数。对于一个节点i,它的左子树节点值小于等于它本身,右子树节点值大于等于它本身。那么如果i的左子树有点j,那么dp[i][j]就可以累加dp[j-1][j-1]。如果i的右子树中有点j,则dp[i][j]可以累加dp[i-1][j]。

最终路径数为dp[n][n],其中n为节点数。

代码示例
int numPaths(TreeNode* root) {
    if (!root) {
        return 0;
    }
    int n = countNodes(root);
    vector<vector<int>> dp(n + 1, vector<int>(n + 1, 0));
    for (int j = 1; j <= n; j++) {
        dp[root->val][j] = 1;
    }
    for (int i = 2; i <= n; i++) {
        for (int j = i; j <= n; j++) {
            if (root->right && root->right->val <= j) {
                dp[root->val][j] += dp[root->right->val][j];
            }
            if (root->left && root->left->val >= i - j + root->val) {
                dp[root->val][j] += dp[root->left->val][j - 1];
            }
        }
        root = root->right;
    }
    return dp[n][n];
}

以上为计算由非递减顺序节点组成的二叉树中的路径的示例代码。