二叉树几个常用的递归算法
二叉树根节点到叶子节点的所有路径
题目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)