最近做了一家公司的笔试题,是求出一棵数中和为一个固定值的所有路径,看到这个题的第一感觉,简单!写的时候懵逼了,因为他输入的是数组,首先要根据数组建一个二叉树,才能进行后续的算法.虽然想法很简单,以前也会,时间长没写全忘了,过不过随缘吧....
# 定义树的数据结构
class TreeNode(object):
def __init__(self, x):
self.val = x
self.left = None
self.right = None
# 根据列表创建二叉树
def creatBTree(data, index):
pNode = None
if index < len(data):
if data[index] == '#':
return
pNode = TreeNode(data[index])
pNode.left = creatBTree(data, 2 * index + 1)
pNode.right = creatBTree(data, 2 * index + 2)
return pNode
# 找出和为某一值的所有路径,先序遍历
def findPath(root, expect):
def helper(root):
nonlocal a, b
if root:
b.append(int(root.val))
if not root.left and not root.right and sum(b) == expect:
a.append(b[:])
else:
helper(root.left)
helper(root.right)
b.pop()
a, b = [], []
helper(root)
return sorted(a, key=len, reverse=True)
# 主函数
if __name__ == "__main__":
expect = int(input())
data = [s for s in input().split(' ')]
root = creatBTree(data, 0)
print(findPath(root, expect))
要注意,输入树的节点应该是按照完全二叉树的顺序输入,比如:
他的输入应该是[1 2 3 # # 4 5]这里的'#'代表None
下面是运行结果: