0
点赞
收藏
分享

微信扫一扫

二叉树几个常用的递归算法

芒果六斤半 2021-09-24 阅读 76
算法

二叉树几个常用的递归算法

二叉树根节点到叶子节点的所有路径

题目1描述

给定一个仅包含数字0-9的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。

例如根节点到叶子节点的一条路径是1->2-> 1->2->3,那么这条路径就用123来代替。
找出根节点到叶子节点的所有路径表示的数字之和

例如:

这棵二叉树一共有两条路径;

根节点到叶子节点的路径1->2用数字12代替

根节点到叶子结点的路径1->3用数字13代替

所以答案为12+13=25

思路

利用先序遍历,直接通过一个数字传递路径上数字和,遇到叶节点返回左右子树相加的结果。

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

#
# 
# @param root TreeNode类 
# @return int整型
#
class Solution:
    def sumNumbers(self , root ):
        return self.t(root,0)
    def t(self,root,sum):
        if not root:return 0
        sum = sum*10+root.val
        if not root.left and not root.right:return sum
        return self.t(root.left,sum)+self.t(root.right,sum)

# 也可以用字符串保存
# class Solution:
#     def sumNumbers(self , root ):
#         res = self.binaryTreePaths(root)
#         sums = 0
#         for i in range(len(res)):
#             sums = sums+int(res[i])
#         return sums
#     def binaryTreePaths(self, root: TreeNode):
#         if not root:
#             return []
#         result = []
#         def dfs(root, auxiliary):
#             if not root:
#                 return
#             if not root.left and not root.right:
#                 auxiliary_auxiliary = auxiliary + str(root.val)
#                 result.append(auxiliary_auxiliary)
#             dfs(root.left, auxiliary + str(root.val))
#             dfs(root.right, auxiliary + str(root.val))
#         dfs(root, '')
#         return result

判断二叉树是否对称

题目2描述

给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)。希望你可以用递归和迭代两种方法解决这个问题。

# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

#
# 
# @param root TreeNode类 
# @return bool布尔型

#层次遍历,注意节点入队的顺序
class Solution:
    def isSymmetric(self , root ):
        if not root:return True
        q = [root.left,root.right]
        while q:
            node1 = q.pop(0)
            node2 = q.pop(0)
            # 前两个节点都为空,继续比较下面的节点
            if not node1 and not node2:
                continue
            # 两个节点不相等时,直接返回false
            if not node1 or not node2 or node1.val!=node2.val:
                return False
            # 按照镜像对称的方式添加节点
            q.append(node1.left)
            q.append(node2.right)
            q.append(node1.right)
            q.append(node2.left)
        return True

# 递归
class Solution:
    def isSymmetric(self , root ):
        if not root:return True
        return self.helper(root.left,root.right)
    def helper(self,left,right):
        # 左右节点都空,返回true
        if not left and not right:return True
        # 左右节点不是全为空,且左右节点val不等,返回false
        if  not left or not right or left.val!=right.val :
            return False
        # 对左右节点的左右节点进行递归
        return self.helper(left.right,right.left) and self.helper(right.right,left.left)
举报

相关推荐

0 条评论