class Node { public int data; public Node left, right; public Node(int item) { data = item; left = right = null; } } class BinaryTree { Node root; public void BottomView() { var map = new SortedDictionary<int, int>(); var queue = new Queue<(Node node, int hd)>(); queue.Enqueue((root, 0)); while (queue.Count > 0) { var (node, hd) = queue.Dequeue(); map[hd] = node.data; if (node.left != null) queue.Enqueue((node.left, hd - 1)); if (node.right != null) queue.Enqueue((node.right, hd + 1)); } foreach (var val in map.Values) { Console.Write(val + " "); } } public void BuildTree() { root = new Node(20); root.left = new Node(8); root.right = new Node(22); root.left.left = new Node(5); root.left.right = new Node(3); root.right.right = new Node(25); root.left.right.left = new Node(10); root.left.right.right = new Node(14); } } var tree = new BinaryTree(); tree.BuildTree(); tree.BottomView();
The bottom view shows the last node visible at each horizontal distance from left to right.
Nodes at horizontal distances -2, -1, 0, 1, 2 are 5, 10, 3, 14, 25 respectively.
class Node { public int data; public Node left, right; public Node(int item) { data = item; left = right = null; } } class BinaryTree { Node root; public void BottomView() { var map = new SortedDictionary<int, int>(); var queue = new Queue<(Node node, int hd)>(); queue.Enqueue((root, 0)); while (queue.Count > 0) { var (node, hd) = queue.Dequeue(); map[hd] = node.data; if (node.left != null) queue.Enqueue((node.left, hd - 1)); if (node.right != null) queue.Enqueue((node.right, hd + 1)); } foreach (var val in map.Values) { Console.Write(val + " "); } } public void BuildTree() { 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); } } var tree = new BinaryTree(); tree.BuildTree(); tree.BottomView();
The bottom view nodes at horizontal distances -1, 0, 1, 2 are 2, 4, 5, 6 respectively.
class Node { public int data; public Node left, right; public Node(int item) { data = item; left = right = null; } } class BinaryTree { Node root; public void BottomView() { var map = new Dictionary<int, int>(); var queue = new Queue<(Node node, int hd)>(); queue.Enqueue((root, 0)); while (queue.Count > 0) { var (node, hd) = queue.Dequeue(); if (!map.ContainsKey(hd)) { map[hd] = node.data; } if (node.left != null) queue.Enqueue((node.left, hd - 1)); if (node.right != null) queue.Enqueue((node.right, hd + 1)); } foreach (var val in map.Values) { Console.Write(val + " "); } } public void BuildTree() { root = new Node(10); root.left = new Node(20); root.right = new Node(30); root.left.left = new Node(40); root.left.right = new Node(60); root.right.left = new Node(90); } } var tree = new BinaryTree(); tree.BuildTree(); tree.BottomView();
The code only inserts a node data if the horizontal distance is not already in the map.
This means the first node at each horizontal distance is kept, but bottom view requires the last node at that horizontal distance.
So the output will be incomplete or incorrect.
Horizontal distance is a measure of how far left or right a node is from the root.
Left child decreases hd by 1, right child increases hd by 1.
class Node { public int data; public Node left, right; public Node(int item) { data = item; left = right = null; } } class BinaryTree { Node root; public void BottomView() { var map = new SortedDictionary<int, int>(); var queue = new Queue<(Node node, int hd)>(); queue.Enqueue((root, 0)); while (queue.Count > 0) { var (node, hd) = queue.Dequeue(); map[hd] = node.data; if (node.left != null) queue.Enqueue((node.left, hd - 1)); if (node.right != null) queue.Enqueue((node.right, hd + 1)); } foreach (var val in map.Values) { Console.Write(val + " "); } } public void BuildTree() { root = new Node(1); root.left = new Node(2); root.right = new Node(3); root.left.left = new Node(4); root.left.right = new Node(5); root.right.left = new Node(6); root.right.right = new Node(7); root.left.right.left = new Node(8); root.left.right.right = new Node(9); } } var tree = new BinaryTree(); tree.BuildTree(); tree.BottomView();
The bottom view nodes at horizontal distances -2, -1, 0, 1, 2 are 4, 8, 6, 9, 7 respectively.
Nodes 2 and 3 are overwritten by nodes 8 and 9 respectively because they appear later in level order traversal at the same horizontal distance.
