ホームページ  >  記事  >  幅優先トラバースはバイナリ ツリーのトラバースとどのように似ていますか?

幅優先トラバースはバイナリ ツリーのトラバースとどのように似ていますか?

青灯夜游
青灯夜游オリジナル
2020-07-25 13:46:1910592ブラウズ

幅優先トラバーサルは、バイナリ ツリーのレベル トラバーサルに似ています。幅優先検索はルート ノードから開始し、ツリーの幅に沿って検索および横断します。つまり、階層的に横断します。各レイヤーを上から下に順番に、各レイヤー内で左から右 (または右から) にアクセスします。左へ) をクリックしてノードにアクセスし、1 つのレベルにアクセスした後、アクセスできるノードがなくなるまで次のレベルに入ります。

幅優先トラバースはバイナリ ツリーのトラバースとどのように似ていますか?

幅優先検索 (実際にはバイナリ ツリーの階層走査)、幅優先検索または水平優先検索とも呼ばれ、ルート ノードから開始されます。ツリーの幅に沿った検索トラバース。

各層に上から下に順番にアクセスします。各層では、左から右 (または右から左) にノードにアクセスします。1 つの層にアクセスした後、アクセスできるノードがなくなるまで次の層に入ります。

幅優先トラバースはバイナリ ツリーのトラバースとどのように似ていますか?

上記のバイナリ ツリーの走査順序は ABCDEFG です。キューを使用して幅優先検索を実装できます。

幅優先検索アルゴリズム:

すべてのノードを保持し、多くのスペースを占有します。バックトラック操作なし (つまり、プッシュまたはポップ操作なし)、高速な実行速度です。 。

幅優先探索アルゴリズムは、一般に生成されたすべてのノードを保存する必要があり、占有される記憶領域は深さ優先探索よりもはるかに大きいため、プログラミング中にオーバーフローとメモリ領域の問題が発生します。節約を考慮する必要があります。ただし、幅優先検索方法には通常、バックトラッキング操作 (プッシュ操作やポップ操作) がないため、深さ優先検索よりも高速に実行されます。

例:

幅優先トラバースはバイナリ ツリーのトラバースとどのように似ていますか?

プロセス検査では、ノードの各層を順番に訪問し、訪問を完了します。 1 つのレイヤー 次のレベルに進むと、各ノードには 1 回だけアクセスできます。上記の例の場合、幅優先トラバーサルの結果は次のとおりです: A、B、C、D、E、F、G、H、I (各層のノードが左から右にアクセスされると仮定します)。

各ノードの幅優先トラバースには、キュー (Queue) データ構造の使用が必要です。キューの特性は先入れ先出しです。実際、両端キューも使用できます。違いは、両端キューの最初の位置を挿入してノードをポップアップできることです。トラバーサル プロセス全体は次のとおりです。

最初に A ノードをキュー queue(A) に挿入します。

A ノードをポップアップし、A の子ノード B と B を挿入します。 C をキューに追加します。この時点では、B はキューの先頭にあり、C はキューの最後にあります。 queue (B, C);

B ノードをポップし、B の子ノードを挿入します。 D と E をキューに追加します。このとき、C はキューの先頭にあります。E はキューの最後にあります。queue (C, D, E);

C ノードをポップし、 C の子ノード F、G、H をキューに挿入します。このとき、D がキューの先頭、H がキューの最後尾になります。キューの最後尾は、queue (D, E) , F, G, H);

D ノードをポップします。D には子ノードがありません。この時点では、E はキューの先頭にあり、H はキューの最後にあります。queue (E, F、G、H);

...順番に下に進み、最後の走査が完了します

Java コードはおおよそ次のとおりです:

public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}
public class Solution {
    public ArrayList<Integer> wide(TreeNode root) {
        ArrayList<Integer> lists=new ArrayList<Integer>();
        if(root==null)
            return lists;
        Queue<TreeNode> queue=new LinkedList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            if(node.left!=null){
                queue.offer(node.left);
            }
            if(node.right!=null){
                queue.offer(node.right);
            }
            lists.add(node.val);
		}
        return lists;
    }
}

関連知識の詳細については、PHP中文网 をご覧ください。

以上が幅優先トラバースはバイナリ ツリーのトラバースとどのように似ていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。