给定一棵二叉树,任务是将同一条垂直线上的所有节点压缩成一个节点,如果垂直线上任何位置的所有节点的设置位计数大于此处的清除位计数那个位置,那么在那个位置的单个节点的位被设置。
例子:
Input:
Output: 1 2
Explanation:
1 and 1 are at same vertical distance, count of set bit at 0th position = 2 and count of clear bit = 0. Therefore, 0th bit of the resultant node is set.
2 and 3 are at same vertical distance, count of set bit at 0th pos = 1 and count of clear bit = 1. Therefore, 0 bit is set of resultant node is not set.
2 and 3 are at same vertical distance, count of set bit at 1st pos = 2 and count of clear bit = 0. Therefore, 1st bit of resultant node is set.
Input:
Output: 1 3 5 2 2
方法:思想是遍历树并跟踪每个访问节点到根节点的水平距离。以下是步骤:
- 一张地图 可用于将距根节点的水平距离作为键存储,将节点的值存储为值。
- 在映射中存储值后,检查每个位置的设置和非设置位的数量,并相应地计算值。
下面是上述方法的实现:
Python3
1
\
2
/
1
\
3
Javascript
1
/ \
3 2
/ \ / \
1 4 1 2
# Python3 program for the above approach
# Structure of a node
# of th tree
class TreeNode:
def __init__(self, val ='', left = None, right = None):
self.val = val
self.left = left
self.right = right
# Function to compress all the nodes
# on the same vertical line
def evalComp(arr):
# Stores node by compressing all
# nodes on the current vertical line
ans = 0
# Check if i-th bit of current bit
# set or not
getBit = 1
# Iterate over the range [0, 31]
for i in range(32):
# Stores count of set bits
# at i-th positions
S = 0
# Stores count of clear bits
# at i-th positions
NS = 0
# Traverse the array
for j in arr:
# If i-th bit of current element
# is set
if getBit & j:
# Update S
S += 1
else:
# Update NS
NS += 1
# If count of set bits at i-th position
# is greater than count of clear bits
if S > NS:
# Update ans
ans += 2**i
# Update getBit
getBit <<= 1
print(ans, end = " ")
# Function to compress all the nodes on
# the same vertical line with a single node
# that satisfies the condition
def compressTree(root):
# Map all the nodes on the same vertical line
mp = {}
# Function to traverse the tree and map
# all the nodes of same vertical line
# to vertical distance
def Trav(root, hd):
if not root:
return
# Storing the values in the map
if hd not in mp:
mp[hd] = [root.val]
else:
mp[hd].append(root.val)
# Recursive calls on left and right subtree
Trav(root.left, hd-1)
Trav(root.right, hd + 1)
Trav(root, 0)
# Getting the range of
# horizontal distances
lower = min(mp.keys())
upper = max(mp.keys())
for i in range(lower, upper + 1):
evalComp(mp[i])
# Driver Code
if __name__ == '__main__':
root = TreeNode(5)
root.left = TreeNode(3)
root.right = TreeNode(2)
root.left.left = TreeNode(1)
root.left.right = TreeNode(4)
root.right.left = TreeNode(1)
root.right.right = TreeNode(2)
# Function Call
compressTree(root)
时间复杂度: O(N)
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。