📜  计算二叉树中可见节点的数量

📅  最后修改于: 2021-09-08 12:31:37             🧑  作者: Mango

给定一个二叉树,任务是找到给定二叉树中可见节点的数量。如果在从根到节点 N 的路径中,没有节点的值大于 N 的值,则节点是可见节点,
例子:

Input:
      5
     /  \
   3     10
  /  \   /
20   21 1

Output: 4 
Explanation:
There are 4 visible nodes. 
They are:
5: In the path 5 -> 3, 5 is the highest node value.
20: In the path 5 -> 3 -> 20, 20 is the highest node value.
21: In the path 5 -> 3 -> 21, 21 is the highest node value.
10: In the path 5 -> 10 -> 1, 10 is the highest node value. 

Input:
      -1
        \
         -2
           \
            -3
Output: 1

方法:思路是先遍历树。由于我们需要看到给定路径中的最大值,所以使用前序遍历来遍历给定的二叉树。在遍历树的过程中,我们需要跟踪到目前为止我们看到的节点的最大值。如果当前节点大于或等于最大值,则增加可见节点的计数并用当前节点值更新最大值。
下面是上述方法的实现:

C++
// C++ implementation to
// count the number of
// visible nodes in the
// binary tree
#include 
using namespace std;
 
// Node containing the
// left and right child of
// current node and the key value
struct Node
{
    int data;
    Node *left, *right;
};
 
/* Utility that allocates a
new node with the given key and
NULL left and right pointers. */
struct Node* newnode(int data)
{
    struct Node* node = new (struct Node);
    node->data = data;
    node->left = node->right = NULL;
    return (node);
}
 
// Variable to keep the track
// of visible nodes
int countNode = 0;
 
// Function to perform the preorder traversal
// for the given tree
void preOrder(Node* node, int mx)
{
    // Base case
    if (node == NULL)
    {
        return;
    }
 
    // If the current node value is greater
    // or equal to the max value,
    // then update count variable
    // and also update max variable
    if (node->data >= mx)
    {
        countNode++;
        mx = max(node->data, mx);
    }
 
    // Traverse to the left
    preOrder(node->left, mx);
 
    // Traverse to the right
    preOrder(node->right, mx);
}
 
// Driver code
int main()
{
    struct Node* root = newnode(5);
 
    /*
            5
           /  \
         3     10
        /  \   /
       20   21 1
*/
 
    root->left = newnode(3);
    root->right = newnode(10);
   
    root->left->left = newnode(20);
    root->left->right = newnode(21);
 
    root->right->left = newnode(1);
 
    preOrder(root, INT_MIN);
 
    cout << countNode;
}
 
// This code is contributed by gauravrajput1


Java
// Java implementation to count the
// number of visible nodes in
// the binary tree
 
// Class containing the left and right
// child of current node and the
// key value
class Node {
    int data;
    Node left, right;
 
    // Constructor of the class
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
public class GFG {
    Node root;
 
    // Variable to keep the track
    // of visible nodes
    static int count;
 
    // Function to perform the preorder traversal
    // for the given tree
    static void preOrder(Node node, int max)
    {
 
        // Base case
        if (node == null) {
            return;
        }
 
        // If the current node value is greater
        // or equal to the max value,
        // then update count variable
        // and also update max variable
        if (node.data >= max) {
            count++;
            max = Math.max(node.data, max);
        }
 
        // Traverse to the left
        preOrder(node.left, max);
 
        // Traverse to the right
        preOrder(node.right, max);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        GFG tree = new GFG();
 
        /*
                5
               /  \
             3     10
            /  \   /
           20   21 1
*/
 
        tree.root = new Node(5);
        tree.root.left = new Node(3);
        tree.root.right = new Node(10);
 
        tree.root.left.left = new Node(20);
        tree.root.left.right = new Node(21);
 
        tree.root.right.left = new Node(1);
 
        count = 0;
        preOrder(tree.root, Integer.MIN_VALUE);
 
        System.out.println(count);
    }
}


Python3
# Python 3 implementation to
# count the number of
# visible nodes in the
# binary tree
 
import sys
# Node containing the
# left and right child of
# current node and the key value
 
class newNode:
   
    def __init__(self, data):
       
        self.data = data
        self.left = None
        self.right = None
 
''' Utility that allocates a
new node with the given key and
None left and right pointers. */
'''
 
# Variable to keep the track
# of visible nodes
countNode = 0
 
# Function to perform the
# preorder traversal for the
# given tree
def preOrder(node, mx):
   
    global countNode
     
    # Base case
    if (node == None):
        return
 
    # If the current node value
    # is greater or equal to the
    # max value, then update count
    # variable and also update max
    # variable
    if (node.data >= mx):
        countNode += 1
        mx = max(node.data, mx)
 
    # Traverse to the left
    preOrder(node.left, mx)
 
    # Traverse to the right
    preOrder(node.right, mx)
 
# Driver code
if __name__ == '__main__':
   
    root = newNode(5)
 
    ''' /*
            5
           /  \
         3     10
        /  /   /
       20   21 1
    */
    '''
    root.left = newNode(3)
    root.right = newNode(10)
    root.left.left = newNode(20)
    root.left.right = newNode(21)
    root.right.left = newNode(1)
    preOrder(root, -sys.maxsize-1)
    print(countNode)
     
# This code is contributed by SURENDRA_GANGWAR


C#
// C# implementation to count the
// number of visible nodes in
// the binary tree
using System;
 
// Class containing the left and right
// child of current node and the
// key value
class Node
{
    public int data;
    public Node left, right;
 
    // Constructor of the class
    public Node(int item)
    {
        data = item;
        left = right = null;
    }
}
 
class GFG{
     
Node root;
 
// Variable to keep the track
// of visible nodes
static int count;
 
// Function to perform the preorder
// traversal for the given tree
static void preOrder(Node node, int max)
{
 
    // Base case
    if (node == null)
    {
        return;
    }
 
    // If the current node value is greater
    // or equal to the max value,
    // then update count variable
    // and also update max variable
    if (node.data >= max)
    {
        count++;
        max = Math.Max(node.data, max);
    }
 
    // Traverse to the left
    preOrder(node.left, max);
 
    // Traverse to the right
    preOrder(node.right, max);
}
 
// Driver code
static public void Main(String[] args)
{
    GFG tree = new GFG();
 
/*
         5
        / \
      3       10
     / \   /
    20 21 1
*/
 
    tree.root = new Node(5);
    tree.root.left = new Node(3);
    tree.root.right = new Node(10);
 
    tree.root.left.left = new Node(20);
    tree.root.left.right = new Node(21);
    tree.root.right.left = new Node(1);
 
    count = 0;
    preOrder(tree.root, int.MinValue);
    Console.WriteLine(count);
}
}
 
// This code is contributed by Amit Katiyar


输出:
4








复杂度分析:
时间复杂度: O(N) ,其中 N 是二叉树中的节点数。
辅助空间: O(H)其中 H 是二叉树的高度。

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live