给定二叉树,任务是计算给定二叉树中的节点数,以使从根到该节点的路径包含值大于或等于该节点的节点。
例子:
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.
方法:想法是在给定的二叉树上进行预遍历。请按照以下步骤解决问题:
- 创建一个函数来计算满足给定条件的节点数。
- 如果当前节点为NULL,则返回上一个节点。
- 使用变量minNodeVal来存储从根到当前节点的路径上的最小节点值。
- 如果当前节点的值小于或等于minNodeVal,则将最终计数增加1并更新minNodeVal的值。
- 调用当前节点左右子节点的函数,并对每个节点重复此过程以获取所需节点的总数。
下面是上述方法的实现:
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)