摘要:如果它是一個空節(jié)點,我們可以使用一個標記值記錄,例如。例如,上面的二叉樹可以被序列化為字符串,其中代表一個空節(jié)點。每個以逗號分隔的字符或為一個整數(shù)或為一個表示指針的。如果滿足前序遍歷,那么最后棧中有且僅有一個元素,且是。
Description
One way to serialize a binary tree is to use pre-order traversal. When we encounter a non-null node, we record the node"s value. If it is a null node, we record using a sentinel value such as #.
_9_ / 3 2 / / 4 1 # 6 / / / # # # # # #
For example, the above binary tree can be serialized to the string "9,3,4,#,#,1,#,#,2,#,6,#,#", where # represents a null node.
Given a string of comma separated values, verify whether it is a correct preorder traversal serialization of a binary tree. Find an algorithm without reconstructing the tree.
Each comma separated value in the string must be either an integer or a character "#" representing null pointer.
You may assume that the input format is always valid, for example it could never contain two consecutive commas such as "1,,3".
Example 1:
Input: "9,3,4,#,#,1,#,#,2,#,6,#,#"
Output: true
Example 2:
Input: "1,#"
Output: false
Example 3:
Input: "9,#,#,1"
Output: false
序列化二叉樹的一種方法是使用前序遍歷。當我們遇到一個非空節(jié)點時,我們可以記錄下這個節(jié)點的值。如果它是一個空節(jié)點,我們可以使用一個標記值記錄,例如 #。
_9_ / 3 2 / / 4 1 # 6 / / / # # # # # #
例如,上面的二叉樹可以被序列化為字符串 "9,3,4,#,#,1,#,#,2,#,6,#,#",其中 # 代表一個空節(jié)點。
給定一串以逗號分隔的序列,驗證它是否是正確的二叉樹的前序序列化。編寫一個在不重構樹的條件下的可行算法。
每個以逗號分隔的字符或為一個整數(shù)或為一個表示 null 指針的 "#" 。
你可以認為輸入格式總是有效的,例如它永遠不會包含兩個連續(xù)的逗號,比如 "1,,3" 。
示例 1:
輸入: "9,3,4,#,#,1,#,#,2,#,6,#,#"
輸出: true
示例 2:
輸入: "1,#"
輸出: false
示例 3:
輸入: "9,#,#,1"
輸出: false
使用棧,如果兩個 # 連續(xù)出現(xiàn),根據(jù)前序遍歷的定義,前面一個一定是葉子節(jié)點,我們將這兩個 # 彈出,然后將葉子節(jié)點重置為 None (即#),如此循環(huán)下去。
如果滿足前序遍歷,那么最后棧中有且僅有一個元素,且是 # 。
# -*- coding: utf-8 -*- # @Author: 何睿 # @Create Date: 2019-03-17 09:44:27 # @Last Modified by: 何睿 # @Last Modified time: 2019-03-17 10:03:55 class Solution: def isValidSerialization(self, preorder: str) -> bool: # stack:用于記錄遍歷到的節(jié)點值 # count:stack 中剩余的節(jié)點個數(shù) stack, count = [], 0 for item in preorder.split(","): stack.append(item) count += 1 # 如果 stack 中末位兩個元素是 #,說明這兩個節(jié)點前面是一個葉子節(jié)點 # 將兩個 # 彈出 ,將葉子節(jié)點置為 None,即 # # 如果是前序遍歷,那么 stack 最后一定會剩下一個 # while count > 1 and stack[-1] == "#" and stack[-2] == "#": stack.pop() stack.pop() if not stack: return False stack[-1] = "#" count -= 2 # 當且僅當 stack 中只剩下一個元素且為 # 時返回 True. return True if len(stack) == 1 and stack[0] == "#" else False
源代碼文件在 這里 。
?本文首發(fā)于 何睿的博客 ,歡迎轉(zhuǎn)載,轉(zhuǎn)載需保留 文章來源 ,作者信息和本聲明.
文章版權歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/43377.html
摘要:如果我們從右往左看先序遍歷,就知道后兩個節(jié)點如果遇到第三個節(jié)點,則該節(jié)點就應當是這兩個節(jié)點的父節(jié)點。如果在遍歷的過程中根節(jié)點數(shù)量小于,則說明這棵樹有問題。而如果遍歷結束之后,剩下的根節(jié)點數(shù)不等于,也說明這個先序遍歷存在問題。 題目要求 One way to serialize a binary tree is to use pre-order traversal. When we en...
摘要:令,那么從累加會一直保持正,最后為。從左往右比較好理解,因為總是總到左再到右,的總是的,所以一定是保持。注意從開始,因為沒有。 Verify Preorder Serialization of a Binary Tree 題目鏈接:https://leetcode.com/problems... recursion,用個全局的index: public class Solution {...
摘要:題目要求將二叉搜索樹序列化和反序列化,序列化是指將樹用字符串的形式表示,反序列化是指將字符串形式的樹還原成原來的樣子。假如二叉搜索樹的節(jié)點較多,該算法將會占用大量的額外空間。 題目要求 Serialization is the process of converting a data structure or object into a sequence of bits so that...
摘要:如果繼續(xù)降序,說明又向左走了,這樣等到下次向右走得時候也要再次更新最小值。這樣,序列無效的條件就是違反了這個最小值的限定。我們同樣可以用本題的方法解,不過是從數(shù)組的后面向前面遍歷,因為在后面了。棧的增長方向也是從高向低了。 Verify Preorder Sequence in Binary Search Tree Given an array of numbers, verify ...
摘要:思路理論上說所有遍歷的方法都可以。但是為了使和的過程都盡量最簡單,是不錯的選擇。用作為分隔符,來表示。復雜度代碼思路這道題和之前不同,一般的樹變成了,而且要求是。還是可以用,還是需要分隔符,但是就不需要保存了。 297. Serialize and Deserialize Binary Tree Serialization is the process of converting a...
閱讀 2086·2023-04-25 19:15
閱讀 2262·2021-11-23 09:51
閱讀 1270·2021-11-17 09:33
閱讀 2175·2021-08-26 14:15
閱讀 2487·2019-08-30 15:54
閱讀 1585·2019-08-30 15:54
閱讀 2175·2019-08-30 12:50
閱讀 1138·2019-08-29 17:08