Python|Dfs回溯解二叉树伪回文

简介: Python|Dfs回溯解二叉树伪回文

问题描述

给你一棵二叉树,每个节点的值为 1 9 。称二叉树中的一条路径是「伪回文」的,当它满足:路径经过的所有节点值的排列中,存在一个回文序列。

请你返回从根到叶子节点的所有路径中伪回文路径的数。

示列1

图示1.1

输入:root = [2,3,1,3,1,null,1]

输出:2

解释:上图为给定的二叉树。总共有3条从根到叶子的路径:红色路径 [2,3,3] ,绿色路径 [2,1,1] 和路径 [2,3,1]

在这些路径中,只有红色和绿色的路径是伪回文路径,因为红色路径 [2,3,3] 存在回文排列 [3,2,3] ,绿色路径 [2,1,1] 存在回文排列 [1,2,1]


解决方案

一开始的思路是遍历二叉树,记录每个叶子节点的路径,再求是否是伪回文。

判断伪回文的方法很简单,伪回文只需要满足一个条件,就是路径中最多只能有一个数是一个的,其他的都是两个,比如[1,1,1,1,1,2] 15个是奇数,21个事奇数,所以不是伪回文,[1,1,1,1,2,2]14个事偶数,2有两个是偶数,所以是伪回文。最后因为先把路径求出来再判断有点浪费时间复杂度。所以可以在遍历时就记录数字的奇数个数就好。

python代码:              

class TreeNode:
    def __init__(self, val=0,  left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def pseudoPalindromicPaths (self,  root: TreeNode):
         self.ass=[0,0,0,0,0,0,0,0,0,0]         #计数路径中数字的个数
        self.res=0              #记录符合路径的个数
        self.dfs(root,[])     #深搜回溯
        return self.res
    def dfs(self,root,path):    #回溯方法
        if root is None:
            return
        self.ass[root.val]+=1    #将节点数值对应的数字个数加1
        if root.left is None and  root.right is None:#当达到叶子节点时开始判断是否为伪回文
            x=0
            for i in range(10):
                if self.ass[i]%2!=0 and  self.ass[i]!=0:#记录数字个数为奇数的数目
                    x+=1
            if x<2:
                self.res+=1#如果路径中数字个数为奇数的数目为10,就是伪回文
        if root.left:
            self.dfs(root.left,path)
        if root.right:
            self.dfs(root.right,path)
        self.ass[root.val]-=1

 


结语

这道题就是二叉树的遍历和伪回文的判断,树的遍历基本上是用dfs来遍历的,所以遇到二叉树就要想到dfs或者bfs来遍历,还有就是回溯的点,这道题很简单,回溯的点就是叶子节点的时候就可以回溯了。



目录
相关文章
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
52 6
|
26天前
|
算法 Python
逆袭之路!用 Python 玩转图的 DFS 与 BFS,让数据结构难题无处遁形
在数据结构的广袤领域中,图是一种强大而复杂的结构,而深度优先搜索(DFS)和广度优先搜索(BFS)则是遍历图的两把利剑。Python 以其简洁和强大的特性,为我们提供了实现和运用这两种算法的便捷途径。
57 0
|
3月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
26 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
3月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
49 7
|
3月前
|
存储 算法 Python
【Leetcode刷题Python】297. 二叉树的序列化与反序列化
LeetCode第297题"二叉树的序列化与反序列化"的Python语言解决方案,包括序列化二叉树为字符串和反序列化字符串为二叉树的算法实现。
25 5
|
3月前
|
Python
【Leetcode刷题Python】236. 二叉树的最近公共祖先
LeetCode上236号问题"二叉树的最近公共祖先"的Python实现,使用递归方法找到两个指定节点的最近公共祖先。
36 5
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - II. 从上到下打印二叉树 II
本文提供了一种Python实现方法,用于层次遍历二叉树并按层打印结果,每层节点按从左到右的顺序排列,每层打印到一行。
35 3
|
3月前
|
Python
【Leetcode刷题Python】199. 二叉树的右视图
LeetCode上199号问题"二叉树的右视图"的Python实现,通过深度优先搜索算法按层序从右向左访问节点,以获取每层的最右边节点的值。
25 4
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - I. 从上到下打印二叉树
本文介绍了使用Python实现从上到下打印二叉树的解决方案,采用层次遍历的方法,利用队列进行节点的访问。
34 2
|
3月前
|
Python
【Leetcode刷题Python】105. 从前序与中序遍历序列构造二叉树
LeetCode上105号问题"从前序与中序遍历序列构造二叉树"的Python实现,通过递归方法根据前序和中序遍历序列重建二叉树。
23 3