如何在描述二叉树的列表中找到深度
How to find depth in a list descrip a binary tree
例如:
[[7, 0, 0], [2, 10, 11], [4, 9, 0], [6, 0, 0], [1, 8, 12], [9, 0, 2], [13, 0, 6], [5, 4, 3], [12, 0, 0], [10, 0, 0], [11, 0, 0], [3, 1, 13], [8, 7, 0]] Root=5
一个列表包含一个子列表,第一个值是节点,第二个值是左边的children,第三个是右边的children。0
表示没有children on left/right,想求每个节点的深度,提取相同深度的节点。
p = lable.index(r)
depth_list = []
depth = 0
depth_list.append([r, 0])
while lable_left_right[p][1] != 0 or lable_left_right[p][2] != 0:
depth += 1
left = lable_left_right[p][1]
right = lable_left_right[p][2]
if left == 0 and right != 0:
p = right
depth_list.append([p, depth])
continue
if right == 0 and left != 0:
p = left
depth_list.append([p, depth])
continue
if left != 0 and right != 0:
p = right
depth_list.append([p, depth])
p = left
depth_list.append([p, depth])
continue
其中lable
是所有节点的列表(在本例中,[7,2,4,6,1,9,13,5,12,10,11,3,8]
和r
是根。lable_left_right
是给定的列表
如果节点有两个 children 我会卡住,但我只能使用一个 p
来继续 while 循环,所以我将失去另一个 children 作为节点来完成任务。
是否有可能在一个while循环的中心开始另一个while循环并继续处理原始循环?如果不是,是否有另一种方法来获取所有节点的深度?
这可以使用以下方法递归解决:
tree = [[7, 0, 0], [2, 10, 11], [4, 9, 0], [6, 0, 0], [1, 8, 12], [9, 0, 2], [13, 0, 6], [5, 4, 3], [12, 0, 0], [10, 0, 0], [11, 0, 0], [3, 1, 13], [8, 7, 0]]
def getRootNode():
centernodes, leftnodes, rightnodes = map(list, zip(*tree))
for node in centernodes:
if (node not in leftnodes) and (node not in rightnodes):
return node
def getLeftNode(n):
for i in range(len(tree)):
if tree[i][0] == n:
return tree[i][1]
def getRightNode(n):
for i in range(len(tree)):
if tree[i][0] == n:
return tree[i][2]
def maxDepth(n):
if n == 0:
return 0
else:
lDepth = maxDepth(getLeftNode(n))
rDepth = maxDepth(getRightNode(n))
if (lDepth > rDepth):
return lDepth+1
else:
return rDepth+1
n = getRootNode()
print("Root Node is " + str(n))
depth = maxDepth(n) - 1
print("Max Depth is " + str(depth))
例如:
[[7, 0, 0], [2, 10, 11], [4, 9, 0], [6, 0, 0], [1, 8, 12], [9, 0, 2], [13, 0, 6], [5, 4, 3], [12, 0, 0], [10, 0, 0], [11, 0, 0], [3, 1, 13], [8, 7, 0]] Root=5
一个列表包含一个子列表,第一个值是节点,第二个值是左边的children,第三个是右边的children。0
表示没有children on left/right,想求每个节点的深度,提取相同深度的节点。
p = lable.index(r)
depth_list = []
depth = 0
depth_list.append([r, 0])
while lable_left_right[p][1] != 0 or lable_left_right[p][2] != 0:
depth += 1
left = lable_left_right[p][1]
right = lable_left_right[p][2]
if left == 0 and right != 0:
p = right
depth_list.append([p, depth])
continue
if right == 0 and left != 0:
p = left
depth_list.append([p, depth])
continue
if left != 0 and right != 0:
p = right
depth_list.append([p, depth])
p = left
depth_list.append([p, depth])
continue
其中lable
是所有节点的列表(在本例中,[7,2,4,6,1,9,13,5,12,10,11,3,8]
和r
是根。lable_left_right
是给定的列表
如果节点有两个 children 我会卡住,但我只能使用一个 p
来继续 while 循环,所以我将失去另一个 children 作为节点来完成任务。
是否有可能在一个while循环的中心开始另一个while循环并继续处理原始循环?如果不是,是否有另一种方法来获取所有节点的深度?
这可以使用以下方法递归解决:
tree = [[7, 0, 0], [2, 10, 11], [4, 9, 0], [6, 0, 0], [1, 8, 12], [9, 0, 2], [13, 0, 6], [5, 4, 3], [12, 0, 0], [10, 0, 0], [11, 0, 0], [3, 1, 13], [8, 7, 0]]
def getRootNode():
centernodes, leftnodes, rightnodes = map(list, zip(*tree))
for node in centernodes:
if (node not in leftnodes) and (node not in rightnodes):
return node
def getLeftNode(n):
for i in range(len(tree)):
if tree[i][0] == n:
return tree[i][1]
def getRightNode(n):
for i in range(len(tree)):
if tree[i][0] == n:
return tree[i][2]
def maxDepth(n):
if n == 0:
return 0
else:
lDepth = maxDepth(getLeftNode(n))
rDepth = maxDepth(getRightNode(n))
if (lDepth > rDepth):
return lDepth+1
else:
return rDepth+1
n = getRootNode()
print("Root Node is " + str(n))
depth = maxDepth(n) - 1
print("Max Depth is " + str(depth))