给定一棵二叉树,找到二叉树的垂直宽度。二叉树的宽度是垂直路径的数量。
例子:
Input :
7
/ \
6 5
/ \ / \
4 3 2 1
Output : 5
Input :
1
/ \
2 3
/ \ / \
4 5 6 7
\ \
8 9
Output : 6
先决条件:以垂直顺序打印二叉树
在此图像中,树包含6条垂直线,这是树的所需宽度。
方法:在此方法中,我们使用该方法来打印二叉树的垂直视图。将水平距离存储为一组,并返回1 +最高水平距离–最低水平距离。添加1时也要考虑水平距离0。在向左移动时,执行hd – 1,向右执行hd +1。我们在哈希表中插入所有可能的距离,最后返回哈希表的大小。
C++
// CPP code to find vertical
// width of a binary tree
#include
using namespace std;
// Tree class
class Node
{
public :
int data;
Node *left, *right;
// Constructor
Node(int data_new)
{
data = data_new;
left = right = NULL;
}
};
// Function to fill hd in set.
void fillSet(Node* root, unordered_set& s,
int hd)
{
if (!root)
return;
fillSet(root->left, s, hd - 1);
s.insert(hd);
fillSet(root->right, s, hd + 1);
}
int verticalWidth(Node* root)
{
unordered_set s;
// Third parameter is horizontal
// distance
fillSet(root, s, 0);
return s.size();
}
int main()
{
Node* root = NULL;
// Creating the above tree
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->right->left->right = new Node(8);
root->right->right->right = new Node(9);
cout << verticalWidth(root) << "\n";
return 0;
}
Java
/* Java code to find the vertical width of a binary tree */
import java.io.*;
import java.util.*;
/* A binary tree node has data, pointer to left child
and a pointer to right child */
class Node
{
int data;
Node left, right;
Node(int item)
{
data = item;
left = right = null;
}
}
class BinaryTree
{
Node root;
/* UTILITY FUNCTIONS */
// Function to fill hd in set.
void fillSet(Node root,Set set,int hd)
{
if(root == null) return;
fillSet(root.left,set,hd - 1);
set.add(hd);
fillSet(root.right,set,hd + 1);
}
int verticalWidth(Node root)
{
Set set = new HashSet();
// Third parameter is horizontal distance
fillSet(root,set,0);
return set.size();
}
/* Driver program to test above functions */
public static void main(String args[])
{
BinaryTree tree = new BinaryTree();
/*
Constructed bunary tree is:
1
/ \
2 3
/ \ \
4 5 8
/ \
6 7
*/
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.left.right = new Node(5);
tree.root.right.right = new Node(8);
tree.root.right.right.left = new Node(6);
tree.root.right.right.right = new Node(7);
System.out.println(tree.verticalWidth(tree.root));
}
}
/* This code is contributed by Ashok Borra */
Python3
# Python code to find vertical
# width of a binary tree
class Node:
def __init__(self, data):
self.data = data
self.left = self.right = None
# Function to fill hd in set.
def fillSet(root, s, hd):
if (not root):
return
fillSet(root.left, s, hd - 1)
s.add(hd)
fillSet(root.right, s, hd + 1)
def verticalWidth(root):
s = set()
# Third parameter is horizontal
# distance
fillSet(root, s, 0)
return len(s)
if __name__ == '__main__':
# Creating the above tree
root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)
root.right.left.right = Node(8)
root.right.right.right = Node(9)
print(verticalWidth(root))
# This code is contributed by PranchalK
C#
// C# code to find the vertical width
// of a binary tree
using System;
using System.Collections.Generic;
/* A binary tree node has data,
pointer to left child and a
pointer to right child */
public class Node
{
public int data;
public Node left, right;
public Node(int item)
{
data = item;
left = right = null;
}
}
public class BinaryTree
{
Node root;
/* UTILITY FUNCTIONS */
// Function to fill hd in set.
void fillSet(Node root, HashSet set, int hd)
{
if(root == null) return;
fillSet(root.left, set, hd - 1);
set.Add(hd);
fillSet(root.right, set, hd + 1);
}
int verticalWidth(Node root)
{
HashSet set = new HashSet();
// Third parameter is horizontal distance
fillSet(root,set, 0);
return set.Count;
}
// Driver Code
public static void Main(String []args)
{
BinaryTree tree = new BinaryTree();
/*
Constructed bunary tree is:
1
/ \
2 3
/ \ \
4 5 8
/ \
6 7
*/
tree.root = new Node(1);
tree.root.left = new Node(2);
tree.root.right = new Node(3);
tree.root.left.left = new Node(4);
tree.root.left.right = new Node(5);
tree.root.right.right = new Node(8);
tree.root.right.right.left = new Node(6);
tree.root.right.right.right = new Node(7);
Console.WriteLine(tree.verticalWidth(tree.root));
}
}
// This code is contributed by PrinciRaj1992
输出:
6