题目描述:
从树的根结点开始往下访问一直到叶子结点经过的所有结点形成一条路径。找出所有的这些路径,使其满足这条路径上所有结点数据的和等于给定的整数。例如,给定如下二叉树与整数8,满足条件的路径为
6->3->-1(6+3-1=8)
思路:
可以通过对二叉树的遍历找出所有的路径,然后判断各条了路径上所有结点的值的和是否与给定的整数相等,若相等则打印这条路径。具体实现方法可以通过对二叉树进行先序遍历来实现。实现思路:对二叉树进行先序遍历,把遍历路径记录下来,当遍历到叶子结点时,判断当前路径上所有结点的数据和是否等于给定的整数,若相等则打印这条路径。
代码实现:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time : 2020/1/26 10:02
# @Author : buu
# @Software: PyCharm
# @Blog :https://blog.csdn.net/weixin_44321080
class BiTNode:
def __init__(self):
self.data = None
self.lchild = None
self.rchild = None
def constructTree():
"""
构造二叉树
:return:
"""
root = BiTNode()
node1 = BiTNode()
node2 = BiTNode()
node3 = BiTNode()
node4 = BiTNode()
root.data = 6
node1.data = 3
node2.data = -7
node3.data = -1
node4.data = 9
root.lchild = node1
root.rchild = node2
node1.lchild = node3
node1.rchild = node4
node2.lchild = node2.rchild = node3.rchild = node3.lchild = \
node4.lchild = node4.rchild = None
return root
def FindRoad(root, num, sums, v):
"""
打印出满足所有结点数据的和等于 num 的所有路径
:param root: 二叉树根结点
:param num: 给定的整数
:param sums: 当前路径上所有结点的和
:param v: 用来存储从根结点到当前遍历到结点的路径
:return:
"""
sums += root.data
v.append(root.data) # 用来记录当前遍历的 root 结点
if root.lchild == None and root.rchild == None and sums == num:
# 遍历到叶子结点,且结点之和等于给定整数
i = 0
while i < len(v) - 1:
print(v[i], end='->')
i += 1
print(v[i])
if root.lchild != None:
FindRoad(root.lchild, num, sums, v)
if root.rchild != None:
FindRoad(root.rchild, num, sums, v)
sums -= v[-1] # 当到某个叶子结点,此时不满足 sums==num,回退一步
v.remove(v[-1])
if __name__ == '__main__':
root = constructTree()
s = []
print('path: ', end='')
FindRoad(root, 8, 0, s)
结果:
算法性能分析:
此方法与二叉树的先序遍历有着相同的时间复杂度O(n);
此外用了一个数组存放遍历路径上结点的值,在最坏的情况下空间复杂度为O(n)(所有结点只有左子树,或所有结点只有右子树),所以空间复杂度为O(n);
end