算法(16)-leetcode-explore-learn-数据结构-二叉树总结
leetcode-explore-learn-數(shù)據(jù)結構-二叉樹3
- 1.根據(jù)中序和后序遍歷序列構造二叉樹
- 2.根據(jù)前序和中序遍歷序列構造二叉樹
- 3.填充每個節(jié)點的下一個右側節(jié)點指針
- 4.填充每個節(jié)點的下一個右側節(jié)點指針2
- 5.二叉樹的最近公共祖先
- 6.二叉樹的序列化和反序列化
本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode官網(wǎng):https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/
所有例題的編程語言為python
二叉樹節(jié)點結構:
1.根據(jù)中序和后序遍歷序列構造二叉樹
inorder=[9,3,15,20,7] 左根右
postorder=[9,15,7,20,3] 左右根,逆序就是根右左:[3,20,7,15,9]
由后序遍歷中可知根節(jié)點是3,在中序遍歷中可以確定左右子樹序列是多少。如何提取下一個根節(jié)點呢?取根和左右子樹遞歸構造該如何銜接。
inorder 用來控制遞歸出口
postorder 才是提供根節(jié)點的源泉。
2.根據(jù)前序和中序遍歷序列構造二叉樹
preorder=[3,9,20,15,7] 中左右
inorder=[9,3,15,20,7] 左中右
一個根節(jié)點可以將中序遍歷劃分為左一半,右一半。
全局變量pre_idx,每次運行一次helper函數(shù)一次加1,取下一根節(jié)點;直至左子樹運行完,對應的根節(jié)點下標也應該遍歷完全了。
剩余問題:index不因該是根節(jié)點的在中序遍歷中的下標么?左子樹包含的內容不是應該為[0,index-1] 根遞歸出口有關,不是直接索引元素。
3.填充每個節(jié)點的下一個右側節(jié)點指針
填充一個完美二叉樹的每個解答的每個節(jié)點的下一個右側節(jié)點。完美二叉樹說的是,所有葉子節(jié)點都在同一層。
思路:關鍵找到每一個節(jié)點的下一個節(jié)點,那不就是二叉樹的層次遍歷。
每層的節(jié)點的next指針指其下一個節(jié)點,用l來控制該層的最后一個節(jié)點指向None。
4.填充每個節(jié)點的下一個右側節(jié)點指針2
給定一個二叉樹,填充它每個next指針指向右側節(jié)點,同一層的最右側節(jié)點填充為None.
思路:不是一棵完美的二叉樹,不過還是樹的層次遍歷,上一題的框架依舊可以使用。
代碼一點沒改能過。
5.二叉樹的最近公共祖先
給定一個二叉樹,找到該樹中兩個指定節(jié)點的最近公共祖先。
官方思路1:遞歸
遞歸遍歷整棵樹,定義fxf_xfx?表示x節(jié)點的子樹中是否包含p節(jié)點或者q節(jié)點,如果包含則為true.采用自底向上從葉子節(jié)點開始更新,保證滿足條件的公共祖先深度最深。
官方思路2:儲存父節(jié)點
用hash表存儲所有節(jié)點的父親節(jié)點,然后利用節(jié)點的父親節(jié)點的信息從p往上跳,直至根節(jié)點,記錄已經(jīng)訪問過的節(jié)點;再從q節(jié)點開始不斷往上跳,每次上跳一個節(jié)點就去p已訪問的節(jié)點中尋找是否已經(jīng)訪問過該節(jié)點。第一次遇到的p已經(jīng)訪問的節(jié)點,則該節(jié)點為答案。
難點1:父親節(jié)點hash表。{child1:root1,child2:root1},只要遍歷過二叉樹的所有節(jié)點,就可以實現(xiàn)這個。
難點2:從p開始,不斷在父親hash表中找父親節(jié)點,直至找不到父親節(jié)點的跟節(jié)點,將所有路徑放入[]中。
技巧:還是將節(jié)點放進去。
6.二叉樹的序列化和反序列化
將二叉樹序列化為一個字符串,將得到的字符串反序列化為二叉樹。
說明:不要使用類成員/全局/靜態(tài)變量來存儲狀態(tài),序列化和反序列化算法應該是無狀態(tài)的。–什么是無狀態(tài)?
序列化和反序列化遞歸順序一致就可以。
class Codec:def serialize(self, root):"""Encodes a tree to a single string.:type root: TreeNode:rtype: str"""def dfs_ser(node,string):if node==None:string+="None,"return stringstring+="{0},".format(node.val)string=dfs_ser(node.left,string)string=dfs_ser(node.right,string)return stringreturn dfs_ser(root,"")def deserialize(self, data):"""Decodes your encoded data to tree.:type data: str:rtype: TreeNode"""def rec_deser(lis):if lis[0]=="None":lis.pop(0)return Noneroot_val=lis[0]root=TreeNode(root_val) # 頂端lis.pop(0)root.left=rec_deser(lis) # 底端root.right=rec_deser(lis)return rootlis=data.split(",")return rec_deser(lis)總結
以上是生活随笔為你收集整理的算法(16)-leetcode-explore-learn-数据结构-二叉树总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NLP复习资料(7)-机器翻译、文本分类
- 下一篇: tests1