Imprimir Nodes en la vista superior del árbol binario – Part 2

La vista superior de un árbol binario es el conjunto de Nodes visibles cuando el árbol se ve desde arriba. Dado un árbol binario, imprima la vista superior del mismo. Los Nodes de salida se pueden imprimir en cualquier orden.

Hay un Node x en la salida si x es el Node superior a su distancia horizontal. La distancia horizontal del hijo izquierdo de un Node x es igual a una distancia horizontal de x menos 1, y la de un hijo derecho es la distancia horizontal de x más 1. 

C++14

// C++ program to print top
// view of binary tree
 
#include <bits/stdc++.h>
using namespace std;
 
// Structure of binary tree
struct Node {
    Node* left;
    Node* right;
    int hd;
    int data;
};
 
// function to create a new node
Node* newNode(int key)
{
    Node* node = new Node();
    node->left = node->right = NULL;
    node->data = key;
    return node;
}
 
// function should print the topView of
// the binary tree
void topview(Node* root)
{
    if (root == NULL)
        return;
    queue<Node*> q;
    map<int, int> m;
    int hd = 0;
    root->hd = hd;
 
    // push node and horizontal distance to queue
    q.push(root);
 
    cout << "The top view of the tree is : \n";
 
    while (q.size()) {
        hd = root->hd;
 
        // count function returns 1 if the container
        // contains an element whose key is equivalent
        // to hd, or returns zero otherwise.
        if (m.count(hd) == 0)
            m[hd] = root->data;
        if (root->left) {
            root->left->hd = hd - 1;
            q.push(root->left);
        }
        if (root->right) {
            root->right->hd = hd + 1;
            q.push(root->right);
        }
        q.pop();
        root = q.front();
    }
 
    for (auto i = m.begin(); i != m.end(); i++) {
        cout << i->second << " ";
    }
}
 
// Driver code
int main()
{
    /* Create following Binary Tree
         1
        / \
       2   3
        \
          4
           \
            5
              \
               6
    */
    Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->right = newNode(4);
    root->left->right->right = newNode(5);
    root->left->right->right->right = newNode(6);
    cout << "Following are nodes in top view of Binary "
            "Tree\n";
    topview(root);
    return 0;
}
/* This code is contributed by Niteesh Kumar */

Java

// Java program to print top
// view of binary tree
import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Queue;
import java.util.TreeMap;
 
// class to create a node
class Node {
    int data;
    Node left, right;
 
    public Node(int data)
    {
        this.data = data;
        left = right = null;
    }
}
 
// class of binary tree
class BinaryTree {
    Node root;
 
    public BinaryTree() { root = null; }
 
    // function should print the topView of
    // the binary tree
    private void TopView(Node root)
    {
        class QueueObj {
            Node node;
            int hd;
 
            QueueObj(Node node, int hd)
            {
                this.node = node;
                this.hd = hd;
            }
        }
        Queue<QueueObj> q = new LinkedList<QueueObj>();
        Map<Integer, Node> topViewMap
            = new TreeMap<Integer, Node>();
 
        if (root == null) {
            return;
        }
        else {
            q.add(new QueueObj(root, 0));
        }
 
        System.out.println(
            "The top view of the tree is : ");
 
        // count function returns 1 if the container
        // contains an element whose key is equivalent
        // to hd, or returns zero otherwise.
        while (!q.isEmpty()) {
            QueueObj tmpNode = q.poll();
            if (!topViewMap.containsKey(tmpNode.hd)) {
                topViewMap.put(tmpNode.hd, tmpNode.node);
            }
 
            if (tmpNode.node.left != null) {
                q.add(new QueueObj(tmpNode.node.left,
                                   tmpNode.hd - 1));
            }
            if (tmpNode.node.right != null) {
                q.add(new QueueObj(tmpNode.node.right,
                                   tmpNode.hd + 1));
            }
        }
        for (Map.Entry<Integer, Node> entry :
             topViewMap.entrySet()) {
            System.out.print(entry.getValue().data + " ");
        }
    }
 
    // Driver Program to test above functions
    public static void main(String[] args)
    {
        /* Create following Binary Tree
        1
       / \
      2   3
       \
         4
          \
           5
             \
              6
   */
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(1);
        tree.root.left = new Node(2);
        tree.root.right = new Node(3);
        tree.root.left.right = new Node(4);
        tree.root.left.right.right = new Node(5);
        tree.root.left.right.right.right = new Node(6);
        System.out.println(
            "Following are nodes in top view of Binary Tree");
        tree.TopView(tree.root);
    }
}

Python3

# Python3 program to print top
# view of binary tree
 
# Binary Tree Node
""" utility that allocates a newNode
with the given key """
 
 
class newNode:
 
    # Construct to create a newNode
    def __init__(self, key):
        self.data = key
        self.left = None
        self.right = None
        self.hd = 0
 
# function should print the topView
# of the binary tree
 
 
def topview(root):
 
    if(root == None):
        return
    q = []
    m = dict()
    hd = 0
    root.hd = hd
 
    # push node and horizontal
    # distance to queue
    q.append(root)
 
    while(len(q)):
        root = q[0]
        hd = root.hd
 
        # count function returns 1 if the
        # container contains an element
        # whose key is equivalent to hd,
        # or returns zero otherwise.
        if hd not in m:
            m[hd] = root.data
        if(root.left):
            root.left.hd = hd - 1
            q.append(root.left)
 
        if(root.right):
            root.right.hd = hd + 1
            q.append(root.right)
 
        q.pop(0)
    for i in sorted(m):
        print(m[i], end="")
 
 
# Driver Code
if __name__ == '__main__':
 
    """ Create following Binary Tree
         1
        / \
       2   3
        \
          4
           \
            5
              \
               6
    """
    root = newNode(1)
    root.left = newNode(2)
    root.right = newNode(3)
    root.left.right = newNode(4)
    root.left.right.right = newNode(5)
    root.left.right.right.right = newNode(6)
    print("Following are nodes in top",
          "view of Binary Tree")
    topview(root)
 
# This code is contributed by
# Shubham Singh(SHUBHAMSINGH10)

C#

// C# program to print top
// view of binary tree
using System;
using System.Collections;
using System.Collections.Generic;
 
// Class to create a node
class Node {
    public int data;
    public Node left, right;
 
    public Node(int data)
    {
        this.data = data;
        left = right = null;
    }
};
 
class QueueObj {
    public Node node;
    public int hd;
 
    public QueueObj(Node node, int hd)
    {
        this.node = node;
        this.hd = hd;
    }
};
 
// Class of binary tree
class BinaryTree {
 
    Node root;
 
    public BinaryTree() { root = null; }
 
    // function should print the topView of
    // the binary tree
    void TopView(Node root)
    {
        Queue q = new Queue();
        SortedDictionary<int, Node> topViewMap
            = new SortedDictionary<int, Node>();
 
        if (root == null) {
            return;
        }
        else {
            q.Enqueue(new QueueObj(root, 0));
        }
 
        // count function returns 1 if the container
        // contains an element whose key is equivalent
        // to hd, or returns zero otherwise.
        while (q.Count != 0) {
            QueueObj tmpNode = (QueueObj)q.Dequeue();
 
            if (!topViewMap.ContainsKey(tmpNode.hd)) {
                topViewMap[tmpNode.hd] = tmpNode.node;
            }
 
            if (tmpNode.node.left != null) {
                q.Enqueue(new QueueObj(tmpNode.node.left,
                                       tmpNode.hd - 1));
            }
            if (tmpNode.node.right != null) {
                q.Enqueue(new QueueObj(tmpNode.node.right,
                                       tmpNode.hd + 1));
            }
        }
 
        foreach(var entry in topViewMap.Values)
        {
            Console.Write(entry.data);
        }
    }
 
    // Driver code
    public static void Main(string[] args)
    {
 
        /* Create following Binary Tree
            1
           / \
          2   3
           \
            4
             \
              5
               \
                6*/
        BinaryTree tree = new BinaryTree();
        tree.root = new Node(1);
        tree.root.left = new Node(2);
        tree.root.right = new Node(3);
        tree.root.left.right = new Node(4);
        tree.root.left.right.right = new Node(5);
        tree.root.left.right.right.right = new Node(6);
 
        Console.WriteLine("Following are nodes "
                          + "in top view of Binary Tree");
 
        tree.TopView(tree.root);
    }
}
 
// This code is contributed by rutvik_56

Javascript

<script>
// Javascript program to print top
// view of binary tree
 
class Node
{
    constructor(data)
    {
        this.data=data;
        this.left = this.right = null;
        this.hd = 0;
    }
}
 
// Driver Code
function topview(root)
{
    if(root == null)
        return;
    let q = [];
    let m = new Map();
    let hd = 0;
    root.hd = hd;
    q.push(root);
     
    while(q.length!=0)
    {
        root = q[0];
        hd = root.hd;
        if(!m.has(hd))
            m.set(hd,root.data);
        if(root.left)
        {
            root.left.hd = hd - 1;
            q.push(root.left);
        }
        if(root.right)
        {
            root.right.hd = hd + 1;
            q.push(root.right);
        }
        q.shift()
    }
     
    let arr = Array.from(m);
    arr.sort(function(a,b){return a[0]-b[0];})
     
    for (let [key, value] of arr.values())
    {
        document.write(value+" ");
    }
}
 
let root = new Node(1)
root.left = new Node(2)
root.right = new Node(3)
root.left.right = new Node(4)
root.left.right.right = new Node(5)
root.left.right.right.right = new Node(6)
document.write("Following are nodes in top",
      "view of Binary Tree<br>")
topview(root)
 
// This code is contributed by avanitrachhadiya2155
</script>

C++

#include <bits/stdc++.h>
using namespace std;
 
// Structure of binary tree
struct Node {
    Node* left;
    Node* right;
    int data;
};
 
// function to create a new node
Node* newNode(int key)
{
    Node* node = new Node();
    node->left = node->right = NULL;
    node->data = key;
    return node;
}
 
// function to fill the map
void fillMap(Node* root, int d, int l,
             map<int, pair<int, int> >& m)
{
    if (root == NULL)
        return;
 
    if (m.count(d) == 0) {
        m[d] = make_pair(root->data, l);
    }
    else if (m[d].second > l) {
        m[d] = make_pair(root->data, l);
    }
 
    fillMap(root->left, d - 1, l + 1, m);
    fillMap(root->right, d + 1, l + 1, m);
}
 
// function should print the topView of
// the binary tree
void topView(struct Node* root)
{
 
    // map to store the pair of node value and its level
    // with respect to the vertical distance from root.
    map<int, pair<int, int> > m;
 
    // fillmap(root,vectical_distance_from_root,level_of_node,map)
    fillMap(root, 0, 0, m);
 
    for (auto it = m.begin(); it != m.end(); it++) {
        cout << it->second.first << " ";
    }
}
// Driver Program to test above functions
int main()
{
    Node* root = newNode(1);
    root->left = newNode(2);
    root->right = newNode(3);
    root->left->right = newNode(4);
    root->left->right->right = newNode(5);
    root->left->right->right->right = newNode(6);
    cout << "Following are nodes in top view of Binary "
            "Tree\n";
    topView(root);
    return 0;
}
/* This code is contributed by Akash Debnath */

Java

// Java program to print top
// view of binary tree
import java.util.*;
 
class GFG {
 
    // Structure of binary tree
    static class Node {
        Node left;
        Node right;
        int data;
    }
 
    static class pair {
        int first, second;
 
        pair() {}
        pair(int i, int j)
        {
            first = i;
            second = j;
        }
    }
 
    // map to store the pair of node value and
    // its level with respect to the vertical
    // distance from root.
    static TreeMap<Integer, pair> m = new TreeMap<>();
 
    // function to create a new node
    static Node newNode(int key)
    {
        Node node = new Node();
        node.left = node.right = null;
        node.data = key;
        return node;
    }
 
    // function to fill the map
    static void fillMap(Node root, int d, int l)
    {
        if (root == null)
            return;
 
        if (m.get(d) == null) {
            m.put(d, new pair(root.data, l));
        }
        else if (m.get(d).second > l) {
            m.put(d, new pair(root.data, l));
        }
 
        fillMap(root.left, d - 1, l + 1);
        fillMap(root.right, d + 1, l + 1);
    }
 
    // function should print the topView of
    // the binary tree
    static void topView(Node root)
    {
        fillMap(root, 0, 0);
 
        for (Map.Entry<Integer, pair> entry :
             m.entrySet()) {
            System.out.print(entry.getValue().first + " ");
        }
    }
 
    // Driver Code
    public static void main(String args[])
    {
        Node root = newNode(1);
        root.left = newNode(2);
        root.right = newNode(3);
        root.left.right = newNode(4);
        root.left.right.right = newNode(5);
        root.left.right.right.right = newNode(6);
        System.out.println("Following are nodes in"
                           + " top view of Binary Tree");
        topView(root);
    }
}
 
// This code is contributed by Arnab Kundu

Python3

# Binary Tree Node
""" utility that allocates a newNode
with the given key """
 
 
class newNode:
 
    # Construct to create a newNode
    def __init__(self, key):
        self.data = key
        self.left = None
        self.right = None
 
# function to fill the map
 
 
def fillMap(root, d, l, m):
    if(root == None):
        return
 
    if d not in m:
        m[d] = [root.data, l]
    elif(m[d][1] > l):
        m[d] = [root.data, l]
    fillMap(root.left, d - 1, l + 1, m)
    fillMap(root.right, d + 1, l + 1, m)
 
# function should print the topView of
# the binary tree
 
 
def topView(root):
 
    # map to store the pair of node value and its level
    # with respect to the vertical distance from root.
    m = {}
 
    fillMap(root, 0, 0, m)
    for it in sorted(m.keys()):
        print(m[it][0], end=" ")
 
 
# Driver Code
root = newNode(1)
root.left = newNode(2)
root.right = newNode(3)
root.left.right = newNode(4)
root.left.right.right = newNode(5)
root.left.right.right.right = newNode(6)
print("Following are nodes in top view of Binary Tree")
topView(root)
 
# This code is contributed by SHUBHAMSINGH10

C#

// C# program to print top
// view of binary tree
using System;
using System.Collections;
using System.Collections.Generic;
 
class GFG {
 
    // Structure of binary tree
    class Node {
        public Node left;
        public Node right;
        public int data;
    }
 
    class pair {
        public int first, second;
 
        public pair(int i, int j)
        {
            first = i;
            second = j;
        }
    }
 
    // map to store the pair of node value and
    // its level with respect to the vertical
    // distance from root.
    static SortedDictionary<int, pair> m
        = new SortedDictionary<int, pair>();
 
    // function to create a new node
    static Node newNode(int key)
    {
        Node node = new Node();
        node.left = node.right = null;
        node.data = key;
        return node;
    }
 
    // function to fill the map
    static void fillMap(Node root, int d, int l)
    {
        if (root == null)
            return;
 
        if (!m.ContainsKey(d)) {
            m[d] = new pair(root.data, l);
        }
        else if (m[d].second > l) {
            m[d] = new pair(root.data, l);
        }
 
        fillMap(root.left, d - 1, l + 1);
        fillMap(root.right, d + 1, l + 1);
    }
 
    // function should print the topView of
    // the binary tree
    static void topView(Node root)
    {
        fillMap(root, 0, 0);
 
        foreach(pair entry in m.Values)
        {
            Console.Write(entry.first + " ");
        }
    }
 
    // Driver Code
    public static void Main(string[] args)
    {
        Node root = newNode(1);
        root.left = newNode(2);
        root.right = newNode(3);
        root.left.right = newNode(4);
        root.left.right.right = newNode(5);
        root.left.right.right.right = newNode(6);
        Console.WriteLine("Following are nodes in"
                          + " top view of Binary Tree");
        topView(root);
    }
}
 
// This code is contributed by pratham76

Javascript

<script>
// Javascript program to print top
// view of binary tree
 
// Structure of binary tree
class Node
{
    constructor()
    {
        this.data = 0;
        this.left = this.right = null;
    }
}
 
class pair
{
    constructor(i, j)
    {
        this.first = i;
        this.second = j;
    }
}
 
// map to store the pair of node value and
    // its level with respect to the vertical
    // distance from root.
let m = new Map();
     
// function to create a new node   
function newNode(key)
{
    let node = new Node();
        node.left = node.right = null;
        node.data = key;
        return node;
}
 
// function to fill the map
function fillMap(root, d, l)
{
    if (root == null)
            return;
  
        if (m.get(d) == null) {
            m.set(d, new pair(root.data, l));
        }
        else if (m.get(d).second > l) {
            m.set(d, new pair(root.data, l));
        }
  
        fillMap(root.left, d - 1, l + 1);
        fillMap(root.right, d + 1, l + 1);
}
 
// function should print the topView of
    // the binary tree
function topView(root)
{
    fillMap(root, 0, 0);
      
    let arr=Array.from(m.keys());
     
    arr.sort(function(a,b){return a-b;});
        for (let key of arr.values()) {
            document.write(m.get(key).first + " ");
        }
}
 
// Driver Code
let root = newNode(1);
root.left = newNode(2);
root.right = newNode(3);
root.left.right = newNode(4);
root.left.right.right = newNode(5);
root.left.right.right.right = newNode(6);
document.write("Following are nodes in"
                   + " top view of Binary Tree<br>");
topView(root);
 
// This code is contributed by rag2127
</script>

C++14

// C++ Program to print Top View of a binary Tree
 
#include <iostream>
#include <queue>
#include <stack>
using namespace std;
 
// class for Tree node
class Node {
public:
    Node *left, *right;
    int data;
    Node() { left = right = 0; }
    Node(int data)
    {
        left = right = 0;
        this->data = data;
    }
};
 
/*
          1
         / \
        2   3
         \
          4
           \
            5
             \
              6
    Top view of the above binary tree is
    2 1 3 6
*/
 
// class for Tree
class Tree {
public:
    Node* root;
    Tree() { root = 0; }
 
    void topView()
    {
        // queue for holding nodes and their horizontal
        // distance from the root node
        queue<pair<Node*, int> > q;
 
        // pushing root node with distance 0
        q.push(make_pair(root, 0));
 
        // hd is current node's horizontal distance from
        // root node l is current left min horizontal
        // distance (or max in magnitude) so far from the
        // root node r is current right max horizontal
        // distance so far from the root node
 
        int hd = 0, l = 0, r = 0;
 
        // stack is for holding left node's data because
        // they will appear in reverse order that is why
        // using stack
        stack<int> left;
 
        // vector is for holding right node's data
        vector<int> right;
 
        Node* node;
 
        while (q.size()) {
 
            node = q.front().first;
            hd = q.front().second;
 
            if (hd < l) {
                left.push(node->data);
                l = hd;
            }
            else if (hd > r) {
                right.push_back(node->data);
                r = hd;
            }
 
            if (node->left) {
                q.push(make_pair(node->left, hd - 1));
            }
            if (node->right) {
                q.push(make_pair(node->right, hd + 1));
            }
 
            q.pop();
        }
        // printing the left node's data in reverse order
        while (left.size()) {
            cout << left.top() << " ";
            left.pop();
        }
 
        // then printing the root node's data
        cout << root->data << " ";
 
        // finally printing the right node's data
        for (auto x : right) {
            cout << x << " ";
        }
    }
};
 
// Driver code
int main()
{
    // Tree object
    Tree t;
    t.root = new Node(1);
    t.root->left = new Node(2);
    t.root->right = new Node(3);
    t.root->left->right = new Node(4);
    t.root->left->right->right = new Node(5);
    t.root->left->right->right->right = new Node(6);
    t.topView();
    cout << endl;
    return 0;
}

Python3

# Python Program to print Top View of a binary Tree
 
# Class of tree node
 
 
class Node:
    def __init__(self, data):
        self.left = None
        self.right = None
        self.data = data
 
 
'''
          1
         / \
        2   3
         \
          4
          \
            5
             \
              6
    Top view of the above binary tree is
    2 1 3 6
'''
 
# class for Tree
 
 
class Tree:
    def __init__(self):
        self.root = None
 
    def topView(self):
 
        # queue for holding nodes and their horizontal
        # distance from the root node
        q = []
 
        # pushing root node with distance 0
        q.append((self.root, 0))
 
        # hd is current node's horizontal distance from
        #  root node l is current left min horizontal
        #  distance (or max in magnitude) so far from the
        #  root node r is current right max horizontal
        # distance so far from the root node
 
        hd = 0
        l = 0
        r = 0
 
        # stack is for holding left node's data because
        # they will appear in reverse order that is why
        # using stack
        left = []
 
        # list is for holding right node's data
        right = []
 
        while len(q) > 0:
            node, hd = q[0]
 
            if hd < l:
                left.append(node.data)
                l = hd
 
            elif hd > r:
                right.append(node.data)
                r = hd
 
            if node.left != None:
                q.append((node.left, hd-1))
 
            if node.right != None:
                q.append((node.right, hd+1))
            q.pop(0)
 
        # printing the left node's data in reverse order
        while len(left) > 0:
            x = left.pop()
            print(x, end=" ")
 
        # then printing the root node's data
        print(self.root.data, end=" ")
 
        # finally printing the right node's data
        for x in right:
            print(x, end=" ")
 
 
# Driver code
if __name__ == '__main__':
    # Tree object
    t = Tree()
    t.root = Node(1)
    t.root.left = Node(2)
    t.root.right = Node(3)
    t.root.left.right = Node(4)
    t.root.left.right.right = Node(5)
    t.root.left.right.right.right = Node(6)
    t.topView()
 
    print()
 
# This code is contributed by Tapesh(tapeshdua420)

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *