📌  相关文章
📜  从根到叶路径形成的所有数字的总和

📅  最后修改于: 2022-05-13 01:57:17.046000             🧑  作者: Mango

从根到叶路径形成的所有数字的总和

给定一棵二叉树,其中每个节点值都是 1-9 的数字。求从根路径到叶路径形成的所有数字的总和。
例如考虑下面的二叉树。

6
       /      \
     3          5
   /   \          \
  2     5          4  
      /   \
     7     4
  There are 4 leaves, hence 4 root to leaf paths:
   Path                    Number
  6->3->2                   632
  6->3->5->7               6357
  6->3->5->4               6354
  6->5>4                    654   
Answer = 632 + 6357 + 6354 + 654 = 13997 

这个想法是对树进行前序遍历。在前序遍历中,跟踪计算到当前节点的值,令该值为val 。对于每个节点,我们将val更新为val*10加上节点的数据。

C++
// C++ program to find sum of
// all paths from root to leaves
#include 
using namespace std;
 
class node
{
    public:
    int data;
    node *left, *right;
};
 
// function to allocate new node with given data
node* newNode(int data)
{
    node* Node = new node();
    Node->data = data;
    Node->left = Node->right = NULL;
    return (Node);
}
 
// Returns sum of all root to leaf paths.
// The first parameter is root
// of current subtree, the second
// parameter is value of the number formed
// by nodes from root to this node
int treePathsSumUtil(node *root, int val)
{
    // Base case
    if (root == NULL) return 0;
 
    // Update val
    val = (val*10 + root->data);
 
    // if current node is leaf, return the current value of val
    if (root->left==NULL && root->right==NULL)
    return val;
 
    // recur sum of values for left and right subtree
    return treePathsSumUtil(root->left, val) +
        treePathsSumUtil(root->right, val);
}
 
// A wrapper function over treePathsSumUtil()
int treePathsSum(node *root)
{
    // Pass the initial value as 0
    // as there is nothing above root
    return treePathsSumUtil(root, 0);
}
 
// Driver code
int main()
{
    node *root = newNode(6);
    root->left = newNode(3);
    root->right = newNode(5);
    root->left->left = newNode(2);
    root->left->right = newNode(5);
    root->right->right = newNode(4);
    root->left->right->left = newNode(7);
    root->left->right->right = newNode(4);
    cout<<"Sum of all paths is "<


C
// C program to find sum of all paths from root to leaves
#include 
#include 
 
struct node
{
    int data;
    struct node *left, *right;
};
 
// function to allocate new node with given data
struct node* newNode(int data)
{
    struct node* node = (struct node*)malloc(sizeof(struct node));
    node->data = data;
    node->left = node->right = NULL;
    return (node);
}
 
// Returns sum of all root to leaf paths. The first parameter is root
// of current subtree, the second parameter is value of the number formed
// by nodes from root to this node
int treePathsSumUtil(struct node *root, int val)
{
    // Base case
    if (root == NULL)  return 0;
 
    // Update val
    val = (val*10 + root->data);
 
    // if current node is leaf, return the current value of val
    if (root->left==NULL && root->right==NULL)
       return val;
 
    // recur sum of values for left and right subtree
    return treePathsSumUtil(root->left, val) +
           treePathsSumUtil(root->right, val);
}
 
// A wrapper function over treePathsSumUtil()
int treePathsSum(struct node *root)
{
    // Pass the initial value as 0 as there is nothing above root
    return treePathsSumUtil(root, 0);
}
 
// Driver function to test the above functions
int main()
{
    struct node *root = newNode(6);
    root->left        = newNode(3);
    root->right       = newNode(5);
    root->left->left  = newNode(2);
    root->left->right = newNode(5);
    root->right->right = newNode(4);
    root->left->right->left = newNode(7);
    root->left->right->right = newNode(4);
    printf("Sum of all paths is %d", treePathsSum(root));
    return 0;
}


Java
// Java program to find sum of all numbers that are formed from root
// to leaf paths
  
// A binary tree node
class Node
{
    int data;
    Node left, right;
      
    Node(int item)
    {
        data = item;
        left = right = null;
    }
}
  
class BinaryTree
{
    Node root;
  
    // Returns sum of all root to leaf paths. The first parameter is
    // root of current subtree, the second parameter is value of the 
    // number formed by nodes from root to this node
    int treePathsSumUtil(Node node, int val)
    {
        // Base case
        if (node == null)
            return 0;
  
        // Update val
        val = (val * 10 + node.data);
  
        // if current node is leaf, return the current value of val
        if (node.left == null && node.right == null)
            return val;
  
        // recur sum of values for left and right subtree
        return treePathsSumUtil(node.left, val)
                + treePathsSumUtil(node.right, val);
    }
  
    // A wrapper function over treePathsSumUtil()
    int treePathsSum(Node node)
    {
        // Pass the initial value as 0 as there is nothing above root
        return treePathsSumUtil(node, 0);
    }
  
    // Driver program to test above functions
    public static void main(String args[])
    {
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(6);
        tree.root.left = new Node(3);
        tree.root.right = new Node(5);
        tree.root.right.right = new Node(4);
        tree.root.left.left = new Node(2);
        tree.root.left.right = new Node(5);
        tree.root.left.right.right = new Node(4);
        tree.root.left.right.left = new Node(7);
          
        System.out.print("Sum of all paths is " +
                                 tree.treePathsSum(tree.root));  
    }   
}
  
// This code has been contributed by Mayank Jaiswal


Python3
# Python program to find sum of all paths from root to leaves
 
# A Binary tree node
class Node:
 
    # Constructor to create a new node
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
# Returns sums of all root to leaf paths. The first parameter is root
# of current subtree, the second paramete"r is value of the number
# formed by nodes from root to this node
def treePathsSumUtil(root, val):
 
    # Base Case
    if root is None:
        return 0
 
    # Update val
    val = (val*10 + root.data)
 
    # If current node is leaf, return the current value of val
    if root.left is None and root.right is None:
        return val
 
    # Recur sum of values for left and right subtree
    return (treePathsSumUtil(root.left, val) +
            treePathsSumUtil(root.right, val))
 
# A wrapper function over treePathSumUtil()
def treePathsSum(root):
     
    # Pass the initial value as 0 as ther is nothing above root
    return treePathsSumUtil(root, 0)
 
# Driver function to test above function
root = Node(6)
root.left = Node(3)
root.right = Node(5)
root.left.left = Node(2)
root.left.right = Node(5)
root.right.right = Node(4)
root.left.right.left = Node(7)
root.left.right.right = Node(4)
print ("Sum of all paths is", treePathsSum(root))
 
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)


C#
// c# program to find sum of all numbers
// that are formed from root to leaf paths
using System;
 
// A binary tree node
public class Node
{
    public int data;
    public Node left, right;
 
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
class GFG
{
public Node root;
 
// Returns sum of all root to leaf paths.
// The first parameter is root of current
// subtree, the second parameter is value
// of the number formed by nodes from root
// to this node
public virtual int treePathsSumUtil(Node node,
                                    int val)
{
    // Base case
    if (node == null)
    {
        return 0;
    }
 
    // Update val
    val = (val * 10 + node.data);
 
    // if current node is leaf, return
    // the current value of val
    if (node.left == null && node.right == null)
    {
        return val;
    }
 
    // recur sum of values for left and right subtree
    return treePathsSumUtil(node.left, val) +
           treePathsSumUtil(node.right, val);
}
 
// A wrapper function over treePathsSumUtil()
public virtual int treePathsSum(Node node)
{
    // Pass the initial value as 0 as
    // there is nothing above root
    return treePathsSumUtil(node, 0);
}
 
// Driver Code
public static void Main(string[] args)
{
    GFG tree = new GFG();
    tree.root = new Node(6);
    tree.root.left = new Node(3);
    tree.root.right = new Node(5);
    tree.root.right.right = new Node(4);
    tree.root.left.left = new Node(2);
    tree.root.left.right = new Node(5);
    tree.root.left.right.right = new Node(4);
    tree.root.left.right.left = new Node(7);
 
    Console.Write("Sum of all paths is " +
                   tree.treePathsSum(tree.root));
}
}
 
// This code is contributed by Shrikant13


Javascript


输出:

Sum of all paths is 13997

时间复杂度:上面的代码是一个简单的前序遍历代码,每一次访问一次。因此,时间复杂度为 O(n),其中 n 是给定二叉树中的节点数。