ホームページ バックエンド開発 PHPチュートリアル PHP は非再帰的なバイナリ ツリー トラバーサルとスタック シミュレーションの実装を実装します。

PHP は非再帰的なバイナリ ツリー トラバーサルとスタック シミュレーションの実装を実装します。

Jul 29, 2016 am 09:03 AM
array center gt node

バイナリ ツリーの定義は次のとおりです: 空ではないバイナリ ツリーは、ルート ノードと左右のサブツリーの 3 つの基本部分で構成されます。ノードのアクセス位置に応じて 3 つの走査方法があります。 ① NLR: プリオーダー トラバーサル (プリオーダー トラバーサルとも呼ばれます)
——ノードにアクセスする操作は、その左右のサブツリーを走査する前に行われます。
②LNR:インオーダートラバーサル(InorderTraversal)
——ノードにアクセスする操作は、その左右のサブツリー (間) を走査することによって行われます。
③ LRN: ポストオーダートラバーサル
——ノードにアクセスする操作は、その左右のサブツリーを走査した後に発生します。
以下に示すように:

PHP は非再帰的なバイナリ ツリー トラバーサルとスタック シミュレーションの実装を実装します。 バイナリ ツリーは以前は C で記述されており、再帰的トラバーサルは PHP を使用して簡単にシミュレートすることもできます。次の例は最も単純な種類のトラバーサルと考えられます (インターネットを参照)。

<code><span>/**
 * 二叉树遍历
 * @blog<http:>
 */</http:></span>
class Node {
    <span>public</span><span>$value</span>;
    <span>public</span><span>$left</span>;
    <span>public</span><span>$right</span>;
}
<span>//前序遍历,访问根节点-&gt;遍历子左树-&gt;遍历右左树</span>
function preorder(<span>$root</span>){
    <span>$stack</span><span>=</span><span>array</span>();
    array_push(<span>$stack</span>, <span>$root</span>);
    <span>while</span>(<span>!</span>empty(<span>$stack</span>)){
        <span>$center_node</span><span>=</span> array_pop(<span>$stack</span>);
        echo <span>$center_node</span><span>-&gt;</span>value<span>.</span><span>' '</span>;

        <span>if</span>(<span>$center_node</span><span>-&gt;</span>right <span>!=</span><span>null</span>) array_push(<span>$stack</span>, <span>$center_node</span><span>-&gt;</span>right);
        <span>if</span>(<span>$center_node</span><span>-&gt;</span>left <span>!=</span><span>null</span>) array_push(<span>$stack</span>, <span>$center_node</span><span>-&gt;</span>left);
    }
}
<span>//中序遍历,遍历子左树-&gt;访问根节点-&gt;遍历右右树</span>
function inorder(<span>$root</span>){
    <span>$stack</span><span>=</span><span>array</span>();
    <span>$center_node</span><span>=</span><span>$root</span>;
    <span>while</span> (<span>!</span>empty(<span>$stack</span>) <span>||</span><span>$center_node</span><span>!=</span><span>null</span>) {
             <span>while</span> (<span>$center_node</span><span>!=</span><span>null</span>) {
                 array_push(<span>$stack</span>, <span>$center_node</span>);
                 <span>$center_node</span><span>=</span><span>$center_node</span><span>-&gt;</span>left;
             }

             <span>$center_node</span><span>=</span> array_pop(<span>$stack</span>);
             echo <span>$center_node</span><span>-&gt;</span>value <span>.</span><span>" "</span>;

             <span>$center_node</span><span>=</span><span>$center_node</span><span>-&gt;</span>right;
         }
}
<span>//后序遍历,遍历子左树-&gt;访问子右树-&gt;遍历根节点</span>
function postorder(<span>$root</span>){
        <span>$pushstack</span><span>=</span><span>array</span>();
        <span>$visitstack</span><span>=</span><span>array</span>();
        array_push(<span>$pushstack</span>, <span>$root</span>);

        <span>while</span> (<span>!</span>empty(<span>$pushstack</span>)) {
            <span>$center_node</span><span>=</span> array_pop(<span>$pushstack</span>);
            array_push(<span>$visitstack</span>, <span>$center_node</span>);
            <span>if</span> (<span>$center_node</span><span>-&gt;</span>left <span>!=</span><span>null</span>) array_push(<span>$pushstack</span>, <span>$center_node</span><span>-&gt;</span>left);
            <span>if</span> (<span>$center_node</span><span>-&gt;</span>right <span>!=</span><span>null</span>) array_push(<span>$pushstack</span>, <span>$center_node</span><span>-&gt;</span>right);
        }

        <span>while</span> (<span>!</span>empty(<span>$visitstack</span>)) {
            <span>$center_node</span><span>=</span> array_pop(<span>$visitstack</span>);
            echo <span>$center_node</span><span>-&gt;</span>value<span>.</span><span>" "</span>;
        }
}

<span>//创建如上图所示的二叉树</span><span>$a</span><span>=</span><span>new</span> Node();
<span>$b</span><span>=</span><span>new</span> Node();
<span>$c</span><span>=</span><span>new</span> Node();
<span>$d</span><span>=</span><span>new</span> Node();
<span>$e</span><span>=</span><span>new</span> Node();
<span>$f</span><span>=</span><span>new</span> Node();
<span>$a</span><span>-&gt;</span>value <span>=</span><span>'A'</span>;
<span>$b</span><span>-&gt;</span>value <span>=</span><span>'B'</span>;
<span>$c</span><span>-&gt;</span>value <span>=</span><span>'C'</span>;
<span>$d</span><span>-&gt;</span>value <span>=</span><span>'D'</span>;
<span>$e</span><span>-&gt;</span>value <span>=</span><span>'E'</span>;
<span>$f</span><span>-&gt;</span>value <span>=</span><span>'F'</span>;
<span>$a</span><span>-&gt;</span>left <span>=</span><span>$b</span>;
<span>$a</span><span>-&gt;</span>right <span>=</span><span>$c</span>;
<span>$b</span><span>-&gt;</span>left <span>=</span><span>$d</span>;
<span>$c</span><span>-&gt;</span>left <span>=</span><span>$e</span>;
<span>$c</span><span>-&gt;</span>right <span>=</span><span>$f</span>;

<span>//前序遍历</span>
preorder(<span>$a</span>);  <span>//结果是:A B D C E F</span>
inorder(<span>$a</span>);  <span>//结果是: D B A E C F</span>
postorder(<span>$a</span>); <span>//结果是:  D B E F C A</span></code>
ログイン後にコピー
http://www.phpddt.com/php/binary-tree-traverse.html

').addClass('事前番号付け').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadeIn(1700); }); }); 上記は、PHP でのバイナリ ツリー トラバーサルとスタック シミュレーションの非再帰的実装方法を、その側面も含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。

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

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Acer Care Center サービスはまだ初期化中です [修正済み] Acer Care Center サービスはまだ初期化中です [修正済み] Mar 16, 2024 am 10:55 AM

Acer Care Center サービスはまだ初期化中です [修正済み]

Huawei GT3 ProとGT4の違いは何ですか? Huawei GT3 ProとGT4の違いは何ですか? Dec 29, 2023 pm 02:27 PM

Huawei GT3 ProとGT4の違いは何ですか?

nvmでノードを削除する方法 nvmでノードを削除する方法 Dec 29, 2022 am 10:07 AM

nvmでノードを削除する方法

Express を使用してノード プロジェクトでファイルのアップロードを処理する方法 Express を使用してノード プロジェクトでファイルのアップロードを処理する方法 Mar 28, 2023 pm 07:28 PM

Express を使用してノード プロジェクトでファイルのアップロードを処理する方法

修正: Windows 11 で Snipping ツールが機能しない 修正: Windows 11 で Snipping ツールが機能しない Aug 24, 2023 am 09:48 AM

修正: Windows 11 で Snipping ツールが機能しない

Nodeのプロセス管理ツール「pm2」を徹底分析 Nodeのプロセス管理ツール「pm2」を徹底分析 Apr 03, 2023 pm 06:02 PM

Nodeのプロセス管理ツール「pm2」を徹底分析

PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は? PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は? Mar 05, 2025 pm 05:57 PM

PIノードティーチング:PIノードとは何ですか? PIノードをインストールしてセットアップする方法は?

pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化する方法について説明します。 pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化する方法について説明します。 Dec 02, 2022 pm 09:06 PM

pkg を使用して Node.js プロジェクトを実行可能ファイルにパッケージ化する方法について説明します。

See all articles