📌  相关文章
📜  在二叉树中计算从根到自身的路径中具有最小值的节点

📅  最后修改于: 2021-05-06 21:17:35             🧑  作者: Mango

给定二叉树,任务是计算给定二叉树中的节点数,以使从根到该节点的路径包含值大于或等于该节点的节点。

例子:

Input:
               6
             /   \
            7     4
           / \   / \
          3   7 1   2

Output: 5
Explanation:
Root node 6 is considered as its the only node 
in the path from root to itself.
Node 4 has the minimum value in it's path 6->4.
Node 1 has the minimum value in it's path 6->4->1.
Node 2 has the minimum value in it's path 6->4->2.
Node 3 has the minimum value in it's path 6->7->3.

Input:
               8
             /   \
            6     5
           / \   / \
          6   7 3   9

Output: 5
Explanation:
Root node 8 is considered as its the only node
in the path from root to itself.
Node 6 has the minimum value in it's path 8->6.
Node 6 has the minimum value in it's path 8->6->6.
Node 5 has the minimum value in it's path 8->5.
Node 3 has the minimum value in it's path 8->5->3.






方法:想法是在给定的二叉树上进行预遍历。请按照以下步骤解决问题:

  1. 创建一个函数来计算满足给定条件的节点数。
  2. 如果当前节点为NULL,则返回上一个节点。
  3. 使用变量minNodeVal来存储从根到当前节点的路径上的最小节点值。
  4. 如果当前节点的值小于或等于minNodeVal,则将最终计数增加1并更新minNodeVal的值。
  5. 调用当前节点左右子节点的函数,并对每个节点重复此过程以获取所需节点的总数。

下面是上述方法的实现:

C++
// C++ program for the above approach
#include 
using namespace std;
 
// Structure of a tree node
struct Node {
    int key;
    Node *left, *right;
};
 
// Function to create new tree node
Node* newNode(int key)
{
    Node* temp = new Node;
    temp->key = key;
    temp->left = temp->right = NULL;
    return temp;
}
 
// Function to find the total
// number of required nodes
void countReqNodes(Node* root,
                   int minNodeVal, int& ans)
{
    // If current node is null then
    // return to the parent node
    if (root == NULL)
        return;
 
    // Check if current node value is
    // less than or equal to minNodeVal
    if (root->key <= minNodeVal) {
 
        // Update the value of minNodeVal
        minNodeVal = root->key;
 
        // Update the count
        ans++;
    }
 
    // Go to the left subtree
    countReqNodes(root->left,
                  minNodeVal, ans);
 
    // Go to the right subtree
    countReqNodes(root->right,
                  minNodeVal, ans);
}
 
// Driver Code
int main()
{
    /* Binary Tree creation
               8
             /   \
            /     \
           6       5
          / \     /  \
         /   \   /    \
        6     7 3      9
    */
 
    Node* root = newNode(8);
    root->left = newNode(6);
    root->right = newNode(5);
    root->left->left = newNode(6);
    root->left->right = newNode(7);
    root->right->left = newNode(3);
    root->right->right = newNode(9);
 
    int ans = 0, minNodeVal = INT_MAX;
 
    // Function Call
    countReqNodes(root, minNodeVal, ans);
 
    // Print the result
    cout << ans;
 
    return 0;
}


Java
// Java program for the above approach
import java.util.*;
 
class GFG{
 
// Structure of a tree node
static class Node
{
    int key;
    Node left, right;
};
 
// Function to create new tree node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.left = temp.right = null;
    return temp;
}
static int ans;
 
// Function to find the total
// number of required nodes
static void countReqNodes(Node root,
                          int minNodeVal)
{
     
    // If current node is null then
    // return to the parent node
    if (root == null)
        return;
 
    // Check if current node value is
    // less than or equal to minNodeVal
    if (root.key <= minNodeVal)
    {
         
        // Update the value of minNodeVal
        minNodeVal = root.key;
 
        // Update the count
        ans++;
    }
 
    // Go to the left subtree
    countReqNodes(root.left,
                  minNodeVal);
 
    // Go to the right subtree
    countReqNodes(root.right,
                  minNodeVal);
}
 
// Driver Code
public static void main(String[] args)
{
     
    /* Binary Tree creation
               8
             /   \
            /     \
           6       5
          / \     /  \
         /   \   /    \
        6     7 3      9
    */
 
    Node root = newNode(8);
    root.left = newNode(6);
    root.right = newNode(5);
    root.left.left = newNode(6);
    root.left.right = newNode(7);
    root.right.left = newNode(3);
    root.right.right = newNode(9);
 
    int  minNodeVal = Integer.MAX_VALUE;
    ans = 0;
     
    // Function Call
    countReqNodes(root, minNodeVal);
     
    // Print the result
    System.out.print(ans);
}
}
 
// This code is contributed by Amit Katiyar


Python3
# Python3 program for the above approach
import sys
 
ans = 0
 
# Class of a tree node
class Node:
     
    def __init__(self, key):
         
        self.key = key
        self.left = None
        self.right = None
 
# Function to find the total
# number of required nodes
def countReqNodes(root, minNodeVal):
     
    global ans
 
    # If current node is null then
    # return to the parent node
    if root == None:
        return
     
    # Check if current node value is
    # less than or equal to minNodeVal   
    if root.key <= minNodeVal:
         
        # Update the value of minNodeVal
        minNodeVal = root.key
 
        # Update the count
        ans += 1
         
    # Go to the left subtree   
    countReqNodes(root.left, minNodeVal)
 
    # Go to the right subtree
    countReqNodes(root.right, minNodeVal)
 
# Driver Code
if __name__ == '__main__':
     
     # Binary Tree creation
     #           8
     #         /   \
     #        /     \
     #       6       5
     #      / \     /  \
     #     /   \   /    \
     #    6     7 3      9
     #
 
    root = Node(8)
 
    root.left = Node(6)
    root.right = Node(5)
    root.left.left = Node(6)
    root.left.right = Node(7)
    root.right.left = Node(3)
    root.right.right = Node(9)
 
    minNodeVal = sys.maxsize
     
    # Function Call
    countReqNodes(root, minNodeVal)
     
    # Print the result
    print(ans)
 
# This code is contributed by mohit kumar 29


C#
// C# program for the above approach
using System;
 
class GFG{
 
// Structure of a tree node
public class Node
{
    public int key;
    public Node left, right;
};
 
// Function to create new tree node
static Node newNode(int key)
{
    Node temp = new Node();
    temp.key = key;
    temp.left = temp.right = null;
    return temp;
}
 
static int ans;
 
// Function to find the total
// number of required nodes
static void countReqNodes(Node root,
                          int minNodeVal)
{
     
    // If current node is null then
    // return to the parent node
    if (root == null)
        return;
 
    // Check if current node value is
    // less than or equal to minNodeVal
    if (root.key <= minNodeVal)
    {
         
        // Update the value of minNodeVal
        minNodeVal = root.key;
 
        // Update the count
        ans++;
    }
 
    // Go to the left subtree
    countReqNodes(root.left,
                  minNodeVal);
 
    // Go to the right subtree
    countReqNodes(root.right,
                  minNodeVal);
}
 
// Driver Code
public static void Main(String[] args)
{
     
    /* Binary Tree creation
               8
             /   \
            /     \
           6       5
          / \     /  \
         /   \   /    \
        6     7 3      9
    */
 
    Node root = newNode(8);
    root.left = newNode(6);
    root.right = newNode(5);
    root.left.left = newNode(6);
    root.left.right = newNode(7);
    root.right.left = newNode(3);
    root.right.right = newNode(9);
 
    int  minNodeVal = int.MaxValue;
    ans = 0;
     
    // Function Call
    countReqNodes(root, minNodeVal);
     
    // Print the result
    Console.Write(ans);
}
}
 
// This code is contributed by Amit Katiyar


输出:
5
















时间复杂度: O(N)
辅助空间: O(1)