📜  打印二叉树的顶视图 - C# (1)

📅  最后修改于: 2023-12-03 15:25:45.252000             🧑  作者: Mango

打印二叉树的顶视图 - C#

在二叉树上能够看到的节点称为视图,其中顶视图是指从根节点开始,沿着左右孩子节点的路径中第一个出现的节点。本文将介绍如何使用C#编程语言实现打印二叉树的顶视图。

实现思路
  1. 定义一个Dictionary对象用来存储每个节点的水平距离和节点值;
  2. 定义一个Queue队列对象,用来存储每个节点的信息;
  3. 遍历二叉树,在遇到节点时,将节点信息(值和水平距离)加入字典中,同时将节点加入队列中;
  4. 如果当前节点的水平距离已经在字典中存在,那么更新字典中该水平距离对应的值;
  5. 队列的第一个元素表示当前节点的父节点,如果队列中第二个元素不是当前节点的父节点,则说明该节点是顶视图中的一个节点,输出该节点的值;
  6. 如果队列中不止一个元素,那么将队列中的第一个元素出队列;
实现代码

下面是使用C#编写的打印二叉树的顶视图的代码实现。

using System;
using System.Collections.Generic;

public class Node {
    public int value;
    public Node left, right;

    public Node(int value) {
        this.value = value;
        left = null;
        right = null;
    }
}

public class BinaryTree {
    private Node root;

    public BinaryTree(Node root) {
        this.root = root;
    }

    public void PrintTopView() {
        Dictionary<int, int> dict = new Dictionary<int, int>();
        Queue<KeyValuePair<Node, int>> queue = new Queue<KeyValuePair<Node, int>>();
        queue.Enqueue(new KeyValuePair<Node, int>(root, 0));

        while (queue.Count > 0) {
            KeyValuePair<Node, int> item = queue.Dequeue();
            if (!dict.ContainsKey(item.Value)) {
                dict.Add(item.Value, item.Key.value);
            } else {
                dict[item.Value] = item.Key.value;
            }

            if (item.Key.left != null) {
                queue.Enqueue(new KeyValuePair<Node, int>(item.Key.left, item.Value - 1));
            }
            if (item.Key.right != null) {
                queue.Enqueue(new KeyValuePair<Node, int>(item.Key.right, item.Value + 1));
            }

            if (queue.Count > 0 && item.Value != queue.Peek().Value) {
                Console.Write("{0} ", item.Key.value);
            }
        }
    }
}

class Program {
    static void Main(string[] args) {
        Node node = new Node(1);
        node.left = new Node(2);
        node.right = new Node(3);
        node.left.left = new Node(4);
        node.left.right = new Node(5);
        node.right.left = new Node(6);
        node.right.right = new Node(7);
        BinaryTree binaryTree = new BinaryTree(node);
        binaryTree.PrintTopView();
    }
}
结束语

通过上述代码,实现了打印二叉树的顶视图,对于理解和实现树结构有很大的帮助。如果您有任何问题或意见,请在评论区留言。