創造を続け、成長を加速させましょう!「ナゲッツデイリーニュープラン・6月アップデートチャレンジ」に参加して5日目です。クリックしてイベント詳細をご覧ください。
このブラッシング日記の51番目の記事のタイトルは次のとおりです。二分木の事前注文のシリアル化の検証、中
1.トピックの説明:
もう1つの二分木問題、二分木問題はどうですか、それはマルチフォークツリーよりも単純ですか?実際、彼らは同じ解決策を持っています
2.この質問はどのような考えを検討しますか?あなたはどう思いますか?
タイトルの要件は比較的明確です。つまり、数字、コンマ、ポンド記号を含む文字列を指定します。これらはそれぞれ、バイナリツリーノード、文字間隔、および空のノードを表します。
次に、指定された文字列がバイナリツリーのプレオーダートラバーサルの結果であることを何らかの方法で確認します
この要件を見ると、実際に微笑むかもしれませんが、プレオーダートラバーサルメソッドに従って文字列をバイナリツリーに簡単に復元できますか?
しかし、タイトルは、ツリーを再構築できないことを特に強調しているため、別の方法しか見つけることができません
分析する
少し考えてみると、文字列内の特定の文字数に注意を向けることができます。下の図を見てみましょう。
二分木の場合、ノードには2つの子ノードまたは1つの子ノードがあり、タイトルの意味に応じて、2、3などの2つの特定の数値を文字列に追加することができます。
または空のノード#番号と1の番号、たとえば#、3または3、#
次に、文字列をトラバースするときに、#記号が見つかった場合は、補足するノードの数から1を引き、それが数値の場合は、補足するノードの数から1を引き、さらに2を足します。のノード
ここでは、前のレイヤーで補足されるノードの数と、このレイヤーで補足されるノードの数を直接混同することはできません。分離する必要があります。
このように、指定された文字列に配置される文字に焦点を当て、最初からトラバースして、上記のロジックに従って補足する必要のある文字を記録します。
スタック方式を使用して処理し、トラバースを続行できます。#記号が見つかった場合は、補足するノードの数(スタックの最上位の数)から1を減算します。数値の場合は、次に、補足するノードの数を減算します。1を減算し、スタックに2つのノードを追加し続けます。
- トラバーサルプロセス中に、質問で指定された文字列のトラバーサルが完了していないが、補足するノードが使用できなくなった場合は、指定された文字列が要件を満たしていないことを意味します。
- もちろん、完全な文字列をトラバースし、補足されるノードの数がまだ記録されていることがわかった場合は、文字列が完全な二分木プレオーダートラバーサルではないことを示す問題もあります。
- したがって、文字列を完全にトラバースし、追加するノードの数も0である場合にのみ、文字列が完全な二分木プレオーダートラバーサルであると判断できます。
3.コーディング
上記の論理と分析によれば、それを次のコードに変換することができます
ここで、補足するノードを初期化する場合、ルートノードを配置する必要があり、ルートノードが1つしかないため、デフォルトで1つのノードが指定されることに注意してください。
エンコーディングは次のとおりです。
func isValidSerialization(preorder string) bool {
n := len(preorder)
help := []int{1}
// 遍历给出的 字符串
for i := 0; i < n; {
if len(help) == 0 {
return false
}
// 校验字符串中给出的 3 中情况,数字,逗号,# 号
if preorder[i] == ',' {
i++
} else if preorder[i] == '#' {
help[len(help)-1]--
if help[len(help)-1] == 0 {
help = help[:len(help)-1]
}
i++
} else {
for i < n && preorder[i] != ',' {
i++
}
help[len(help)-1]--
if help[len(help)-1] == 0 {
help = help[:len(help)-1]
}
help = append(help, 2)
}
}
return len(help) == 0
}
复制代码
4.要約:
時間計算量は非常に明確で、指定された文字列を1回トラバースするため、時間計算量はO(n)であり、スペース計算量もO(n)です。スタックスペースを開くため、このスペースにはすべての二分木が含まれます。 。ノード
元のタイトルアドレス:331。バイナリツリーのプレオーダーシリアル化を確認します
私は今日ここにいます、私が学んだこと、何か逸脱があれば、私を訂正してください
いいね、フォロー、お気に入りへようこそ
友達、あなたのサポートと励ましは、私が共有を続け、品質を向上させる動機です
さて、これが今回です
テクノロジーはオープンであり、私たちの精神はオープンでなければなりません。変化を受け入れ、太陽の下で生き、そして前進しなさい。
私は小悪魔の少年哪吾です、好きで、フォローして集めて、また会いましょう〜