Python-树-Node_Depth-节点深度

有一个二叉树,长这样

       1       
    /     \    
   2       3   
  / \     / \  
 4   5   6   7 
/ \ / \ / \ / \
8 9 . . . . . .

写一个函数,返回所有节点深度值的和。

其中节点深度是一个节点到根节点的距离,在这里举个例子,根节点是1 ,那么值为2 的节点到根节点的距离是1.

此时应该得到的sum的结果是16。

Solution:

可以使用一个堆栈结构,首先将根节点以及他的深度depth的键值对储存到堆栈中。

这里一个对子是一个字典对象,一个个的字典对象保存在一个stack的列表里。

首先pop出一个元素,将这个元素的深度累加到计数器中,

在字典中记录下他的两个孩子的相同信息,显然此时两个孩子的depth相对于这个节点都要+1,如此往复,直到堆栈为空。

#build tree
def nodeDepths(root):
	sum_of_depth = 0
	stack = [{"node":root,"depth":0}]
	while len(stack)>0:
		node_profile = stack.pop()
		node,depth = node_profile["node"],node_profile["depth"]
		if node is None:
			continue
		print(f"当前处理节点{node.value}")
		sum_of_depth += depth
		stack.append({"node":node.left,"depth":depth + 1})
		if node.left is not None:
			print(f"append节点{node.left.value}") 
		stack.append({"node":node.right,"depth":depth + 1})
		if node.right is not None:
			print(f"append节点{node.right.value}")

		print(stack)
	return sum_of_depth


# This is the class of the input binary tree.
class BinaryTree:
	def __init__(self, value):
		self.value = value
		self.left = None
		self.right = None
A = BinaryTree(1)
B = BinaryTree(2)
C = BinaryTree(3)
A.left = B
A.right = C
D = BinaryTree(4)
E = BinaryTree(5)
B.left = D
B.right = E
F = BinaryTree(6)
G = BinaryTree(7)
C.left = F
C.right = G
H = BinaryTree(8)
I = BinaryTree(9)
D.left = H
D.right = I

print(nodeDepths(A))
# output_array = []
# print(A.breadthFirstSearch(array = output_array))

### Time: O(v+e) v是图的顶点(vertics),e是图的edge
### Space: O(v)  v是返回的array的长度


# for index,element in enumerate(["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K"]):
# 	print(f"{element} = BinaryTree(\"{index+1}\")")
# que = [1,2,3,4,5]
# print(que.pop(0))

output

当前处理节点1
append节点2
append节点3
[{'node': <__main__.BinaryTree object at 0x7ffc6012fbe0>, 'depth': 1}, {'node': <__main__.BinaryTree object at 0x7ffc70125190>, 'depth': 1}]
当前处理节点3
append节点6
append节点7
[{'node': <__main__.BinaryTree object at 0x7ffc6012fbe0>, 'depth': 1}, {'node': <__main__.BinaryTree object at 0x7ffc70125370>, 'depth': 2}, {'node': <__main__.BinaryTree object at 0x7ffc701252b0>, 'depth': 2}]
当前处理节点7
[{'node': <__main__.BinaryTree object at 0x7ffc6012fbe0>, 'depth': 1}, {'node': <__main__.BinaryTree object at 0x7ffc70125370>, 'depth': 2}, {'node': None, 'depth': 3}, {'node': None, 'depth': 3}]
当前处理节点6
[{'node': <__main__.BinaryTree object at 0x7ffc6012fbe0>, 'depth': 1}, {'node': None, 'depth': 3}, {'node': None, 'depth': 3}]
当前处理节点2
append节点4
append节点5
[{'node': <__main__.BinaryTree object at 0x7ffc70125040>, 'depth': 2}, {'node': <__main__.BinaryTree object at 0x7ffc70125490>, 'depth': 2}]
当前处理节点5
[{'node': <__main__.BinaryTree object at 0x7ffc70125040>, 'depth': 2}, {'node': None, 'depth': 3}, {'node': None, 'depth': 3}]
当前处理节点4
append节点8
append节点9
[{'node': <__main__.BinaryTree object at 0x7ffc70125310>, 'depth': 3}, {'node': <__main__.BinaryTree object at 0x7ffc6013c0a0>, 'depth': 3}]
当前处理节点9
[{'node': <__main__.BinaryTree object at 0x7ffc70125310>, 'depth': 3}, {'node': None, 'depth': 4}, {'node': None, 'depth': 4}]
当前处理节点8
[{'node': None, 'depth': 4}, {'node': None, 'depth': 4}]
16
[Finished in 0.6s]

Time: O(n)

Spcae: O(height of tree)

可以看到stack需要的储存空间和数的高度一致。

上一篇:网络流 - dinic + 当前弧优化


下一篇:介绍git clone --depth=1的用法