[ブラシの質問ダイアリー]二分木の事前注文のシリアル化を確認します

創造を続け、成長を加速させましょう!「ナゲッツデイリーニュープラン・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。バイナリツリーのプレオーダーシリアル化を確認します

私は今日ここにいます、私が学んだこと、何か逸脱があれば、私を訂正してください

いいね、フォロー、お気に入りへようこそ

友達、あなたのサポートと励ましは、私が共有を続け、品質を向上させる動機です

さて、これが今回です

テクノロジーはオープンであり、私たちの精神はオープンでなければなりません。変化を受け入れ、太陽の下で生き、そして前進しなさい。

私は小悪魔の少年哪吾です、好きで、フォローして集めて、また会いましょう〜

おすすめ

転載: juejin.im/post/7103925525525053471