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來遍歷,還有就是回溯的點,這道題很簡單,回溯的點就是葉子節點的時候就可以回溯了。

END

編  輯   |   王楠嵐

責  編   |   王自強

 where2go 團隊


   

微信號:算法與編程之美          

長按識別二維碼關注我們!

溫馨提示:點擊頁面右下角“寫留言”發表評論,期待您的參與!期待您的轉發!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章