3.10python如何在二叉树中找出与输入整数相等的所有路径

题目描述:

从树的根结点开始往下访问一直到叶子结点经过的所有结点形成一条路径。找出所有的这些路径,使其满足这条路径上所有结点数据的和等于给定的整数。例如,给定如下二叉树与整数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

发布了76 篇原创文章 · 获赞 2 · 访问量 2554

猜你喜欢

转载自blog.csdn.net/weixin_44321080/article/details/104085991