算法(16)-leetcode-explore-learn-数据结构-二叉树总结
leetcode-explore-learn-數據結構-二叉樹3
- 1.根據中序和后序遍歷序列構造二叉樹
- 2.根據前序和中序遍歷序列構造二叉樹
- 3.填充每個節點的下一個右側節點指針
- 4.填充每個節點的下一個右側節點指針2
- 5.二叉樹的最近公共祖先
- 6.二叉樹的序列化和反序列化
本系列博文為leetcode-explore-learn子欄目學習筆記,如有不詳之處,請參考leetcode官網:https://leetcode-cn.com/explore/learn/card/data-structure-binary-tree/2/traverse-a-tree/7/
所有例題的編程語言為python
二叉樹節點結構:
1.根據中序和后序遍歷序列構造二叉樹
inorder=[9,3,15,20,7] 左根右
postorder=[9,15,7,20,3] 左右根,逆序就是根右左:[3,20,7,15,9]
由后序遍歷中可知根節點是3,在中序遍歷中可以確定左右子樹序列是多少。如何提取下一個根節點呢?取根和左右子樹遞歸構造該如何銜接。
inorder 用來控制遞歸出口
postorder 才是提供根節點的源泉。
2.根據前序和中序遍歷序列構造二叉樹
preorder=[3,9,20,15,7] 中左右
inorder=[9,3,15,20,7] 左中右
一個根節點可以將中序遍歷劃分為左一半,右一半。
全局變量pre_idx,每次運行一次helper函數一次加1,取下一根節點;直至左子樹運行完,對應的根節點下標也應該遍歷完全了。
剩余問題:index不因該是根節點的在中序遍歷中的下標么?左子樹包含的內容不是應該為[0,index-1] 根遞歸出口有關,不是直接索引元素。
3.填充每個節點的下一個右側節點指針
填充一個完美二叉樹的每個解答的每個節點的下一個右側節點。完美二叉樹說的是,所有葉子節點都在同一層。
思路:關鍵找到每一個節點的下一個節點,那不就是二叉樹的層次遍歷。
每層的節點的next指針指其下一個節點,用l來控制該層的最后一個節點指向None。
4.填充每個節點的下一個右側節點指針2
給定一個二叉樹,填充它每個next指針指向右側節點,同一層的最右側節點填充為None.
思路:不是一棵完美的二叉樹,不過還是樹的層次遍歷,上一題的框架依舊可以使用。
代碼一點沒改能過。
5.二叉樹的最近公共祖先
給定一個二叉樹,找到該樹中兩個指定節點的最近公共祖先。
官方思路1:遞歸
遞歸遍歷整棵樹,定義fxf_xfx?表示x節點的子樹中是否包含p節點或者q節點,如果包含則為true.采用自底向上從葉子節點開始更新,保證滿足條件的公共祖先深度最深。
官方思路2:儲存父節點
用hash表存儲所有節點的父親節點,然后利用節點的父親節點的信息從p往上跳,直至根節點,記錄已經訪問過的節點;再從q節點開始不斷往上跳,每次上跳一個節點就去p已訪問的節點中尋找是否已經訪問過該節點。第一次遇到的p已經訪問的節點,則該節點為答案。
難點1:父親節點hash表。{child1:root1,child2:root1},只要遍歷過二叉樹的所有節點,就可以實現這個。
難點2:從p開始,不斷在父親hash表中找父親節點,直至找不到父親節點的跟節點,將所有路徑放入[]中。
技巧:還是將節點放進去。
6.二叉樹的序列化和反序列化
將二叉樹序列化為一個字符串,將得到的字符串反序列化為二叉樹。
說明:不要使用類成員/全局/靜態變量來存儲狀態,序列化和反序列化算法應該是無狀態的。–什么是無狀態?
序列化和反序列化遞歸順序一致就可以。
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