📜  打印二叉树中所有非叶节点的总和和乘积(1)

📅  最后修改于: 2023-12-03 15:39:40.924000             🧑  作者: Mango

打印二叉树中所有非叶节点的总和和乘积

本文介绍如何实现一个函数,该函数可以遍历二叉树,计算所有非叶节点的总和和乘积。

算法设计

首先,我们需要定义一个二叉树节点的结构体如下:

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

接着,我们可以使用深度优先搜索(DFS)算法来遍历二叉树,具体实现如下:

void dfs(TreeNode* root, int& sum, int& product) {
    if (!root) return;
    if (root->left || root->right) {
        sum += root->val;
        product *= root->val;
    }
    dfs(root->left, sum, product);
    dfs(root->right, sum, product);
}

上述函数使用了引用类型的参数,以便在dfs函数递归时,可以维护中间状态。在遍历过程中,如果遇到非叶节点,则将其值加到总和sum中,并与乘积product相乘。最终,函数的返回值也无用处。

代码实现

整个程序的实现如下:

#include<iostream>
using namespace std;

struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

void dfs(TreeNode* root, int& sum, int& product) {
    if (!root) return;
    if (root->left || root->right) {
        sum += root->val;
        product *= root->val;
    }
    dfs(root->left, sum, product);
    dfs(root->right, sum, product);
} 

int main() {
    // create a binary tree
    TreeNode* root = new TreeNode(1);
    root->left = new TreeNode(2);
    root->right = new TreeNode(3);
    root->right->left = new TreeNode(4);
    root->right->right = new TreeNode(5);

    // compute sum and product of all non-leaf nodes
    int sum = 0, product = 1;
    dfs(root, sum, product);
    cout << "Sum of all non-leaf nodes: " << sum << endl;
    cout << "Product of all non-leaf nodes: " << product << endl;

    return 0;
}
测试结果

输入:

   1
  / \
 2   3
    / \
   4   5

输出:

Sum of all non-leaf nodes: 4
Product of all non-leaf nodes: 3
总结

本文介绍了如何实现一个遍历二叉树的深度优先搜索算法,并计算所有非叶节点的总和和乘积。该算法可以解决一类二叉树相关的计算问题,具有一定的通用性。