ツリー構造を実装する 2 つの方法_PHP チュートリアル
ツリー構造を実装する 2 つの方法
1.再帰メソッド
再帰とは、関数内でそれ自体を明示的に呼び出すことを意味します。
再帰的手法を使用してツリー構造を実現すると、データの書き込み速度が速くなり、表示速度が遅くなるという特徴があります (特にツリーに多くの分岐/レベルがある場合に顕著です)。書き込むデータ量が多く、ツリー構造が複雑な場合に適しています。
データ構造 (mysql を例にします)
コード:------------------------------------- ---------------------------------------------------- --------
CREATE TABLE `tree1` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`parentid` tinyint(3) unsigned NOT NULL デフォルト '0',
`topic` varchar (50) デフォルト NULL,
PRIMARY KEY (`id`),
KEY `parentid` (`parentid`)
) TYPE=MyISAM;
INSERT INTO `tree1` (`id`, `parentid`, `topic` ) 値
(1,0,'ツリー 1')、
( 2,0,'ツリー 2')、
(3,0,'ツリー 3')、
(4,2,'ツリー 2-1') 、
(5,4,'ツリー 2-1-1' )、
(6,2,'ツリー 2-2')、
(7,1,'ツリー 1-1')、
(8,1 ,'ツリー 1-2'),
(9,1, 'ツリー 1-3'),
(10,8,'ツリー 1-2-1'),
(11,7,'ツリー 1-1 -1'),
(12,11,'ツリー 1- 1-1-1');
------------------------------------- ---------------------------------------------------- ----
フィールド説明
id、レコード番号
parentid、レコードの親レコードID(0の場合はルートレコード)
topic、レコードの表示タイトル
表示プログラム
シーケンスツリー:
PHPコード:----------------------- ------------------------ -------------------------- ------------------
/* データベース接続*/
mysql_connect();
mysql_select_db('tree');
/* ツリー表示 再帰関数 */
functiontree($parentid = 0) {
/* SQLクエリを実行してタイトルとレコードの ID*/
$sql = "select topic,id fromtree1 whereparentid = $parentid order by id asc ";
$rs = mysql_query($sql);
/* Indent*/
echo("< ul>");
while($ra = mysql_fetch_row($rs)) {
/* レコードタイトルを表示* /
echo ('& lt; li & gt;'. $ Ra [0]. '& Lt;/ li & gt;');
/* 再帰呼び出し */
ツリー ($ ra [1]);/ul>");
}
?>
----- ------------------------- ------------------------ -------------------------
逆順ツリー:
PHP コード:----------- ---------------------------------- ---------------- ------------------------
/* データベース接続*/
mysql_connect();
mysql_select_db('tree');
/* ツリー表示用の再帰関数*/
function Tree($parentid = 0) {
/* SQL クエリを実行してレコード ID のタイトルとレコードを取得*/
$sql = "select topic,id fromtree1 where parentid = $parentid order by id desc";
$rs = mysql_query($sql);
/* Indent*/
echo("
- ");
- '.$ra[0].' ');
while($ra = mysql_fetch_row($rs)) {
/* レコードのタイトルを表示*/
echo('
/* 再帰呼び出し*/
tree($ra[1]);
}
echo("
}
tree();
?>
------ ----------------- --------------------------------- --------------- ------
データプログラム
PHPコードを挿入:---------------- --------------- --------------------------------- --------------
< ;?
/* データベース接続*/
mysql_connect();
mysql_select_db('tree');
$sql = "ツリー (トピック、親 ID) 値に挿入 ('ツリー 3-1',3);";
mysql_query($sql);
?>
--------------------- --------------- --------------------------------- ----------
2.ソートフィールドメソッド
このメソッドは、ツリー全体におけるレコードの連続位置をマークするフィールドをデータ構造に追加することによって実装されます。表示速度と効率が高いのが特徴です。しかし、単一ツリーの構造が複雑になると、データの書き込み効率が不十分になる。また、順番に並べる場合、レコードの挿入や削除のアルゴリズムが複雑すぎるため、通常は逆順が使用されます。
データ構造 (mysql を例にします)
コード:------------------------------------- ---------- -------------------------------------- ----------
CREATE TABLE `tree2` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`parentid` tinyint(3) unsigned NOT NULL デフォルト '0',
`rootid` tinyint(3) unsigned NOT NULL デフォルト '0',
`layer` tinyint(3) unsigned NOT NULL デフォルト '0',
`orders` tinyint(3) unsigned NOT NULL デフォルト '0',
`topic` varchar( 50) デフォルト NULL、
PRIMARY KEY (`id`)、
KEY `parentid` (`parentid`)、
KEY `rootid` (`rootid`)
) TYPE=MyISAM
INSERT INTO `tree2` (`id `、`parentid`、`rootid`、`layer`、`orders`、`topic`) 値
(1,0,1,0,0,'Tree 1'),
(2,0,2,0) ,0,'ツリー 2'),
(3,0,3 ,0,0,'ツリー 3'),
(4,2,2,1,2,'ツリー 2-1'),
(5 ,4,2,2,3,'ツリー 2-1-1 '),
(6,2,2,1,1,'ツリー 2-2'),
(7,1,1,1,4 ,'ツリー 1-1'),
(8,1,1 ,1,2,'ツリー 1-2'),
(9,1,1,1,1,'ツリー 1-3'),
(10,8,1,2,3,'ツリー 1-2 -1')、
(11,7,1,2,5,'ツリー 1-1-1')、
(12,11,1) ,3,6,'ツリー 1-1-1-1') ;
-------------------------------- ---------------- --------------------------------
表示プログラム
PHPコード:-------- ---------------------------------- ---------------- -----------------------
/* データベース接続* /
mysql_connect();
mysql_select_db('tree');
/ * すべてのルート レコード ID を選択します */
$sql = "select id from Tree2 whereparentid = 0 order by id desc";
$rs = mysql_query( $sql);
echo("
- ");
$lay = 0;
while($ra = mysql_fetch_row($rs)) {
echo("
- ");
/* すべて選択このツリー内のレコードを注文フィールド*/
$sql = "select topic,layer from Tree2 where rootid = $ra[0] order by order";
$rs1 = mysql_query($sql);
while($ra1 = mysql_fetch_row($ rs1)){
/* indent display* /
lay){
使用して - s ’sを介してs’ sを使用して使用して使用します。 & gt; $ ra1 [0] & lt;/li & gt; ");
$lay = $ ra1 [1];}} (" & lt;/ul & gt; ");
}
echo("
?>
--------------------------------- -- ------------------------------------------------
データプログラムの挿入
PHPコード:----------------------------------------------------- ---------- --------------------------------------
< ;?
/* データベース接続 */
mysql_connect();
mysql_select_db('tree');
/* ルートレコードを挿入*/
$sql = "ツリー 2 (トピック) の値に挿入 ('tree5') ";
mysql_query($sql) ;
$sql = "update Tree2 set rootid = id where id = ".mysql_insert_id();
mysql_query($sql);
/* 子レコードを挿入*/
$parentid = 5 ;//親レコード ID
/ * ルート レコード ID、親レコードのインデント レベル、および親レコードの順序位置を取得します*/
$sql = "select rootid,layer,orders fromtree2 where id = $parentid";
list ($rootid,$layer,$orders) = mysql_fetch_row(mysql_query($sql));
/* 位置を挿入した後に記録された注文値を更新します*/
$sql = "updatetree2 setorders =orders + 1 whereorders > ; $orders";
mysql_query($sql) ;
/* レコードを挿入*/
$sql = "tree2 (rootid,parentid,orders,layer,topic) の値 ($rootid,$parentid,") に挿入します。 ($orders+1).",".($layer+1).",'ツリー 2-1-1-2')";
mysql_query($sql);?>
http://www.bkjia.com/PHPjc/314792.html
www.bkjia.com
true
http://www.bkjia.com/PHPjc/314792.html

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











残念ながら、WeChat は広く使用されているソーシャル ソフトウェアであり、何らかの理由で特定の連絡先を誤って削除してしまうことがよくあります。ユーザーがこの問題を解決できるように、この記事では、削除された連絡先を簡単な方法で取得する方法を紹介します。 1. WeChat の連絡先削除メカニズムを理解します。これにより、削除された連絡先を取得できるようになります。WeChat の連絡先削除メカニズムでは、連絡先がアドレス帳から削除されますが、完全には削除されません。 2. WeChat の組み込みの「連絡先帳復元」機能を使用します。WeChat には、この機能を通じて以前に削除した連絡先をすばやく復元できる「連絡先帳復元」機能が用意されています。 3. WeChat 設定ページに入り、右下隅をクリックし、WeChat アプリケーション「Me」を開き、右上隅にある設定アイコンをクリックして設定ページに入ります。

テクノロジーの発展に伴い、モバイルゲームは人々の生活に欠かせないものになりました。かわいいドラゴンエッグの画像と面白い孵化過程で多くのプレイヤーの注目を集めており、その中でも注目を集めているゲームの一つがモバイル版ドラゴンエッグです。プレイヤーがゲーム内で自分のドラゴンをより適切に育成し成長させることができるように、この記事ではモバイル版でドラゴンの卵を孵化させる方法を紹介します。 1. 適切な種類のドラゴン エッグを選択する プレイヤーは、ゲーム内で提供されるさまざまな種類のドラゴン エッグの属性と能力に基づいて、自分に適したドラゴン エッグの種類を慎重に選択する必要があります。 2. 孵化機のレベルをアップグレードします。プレイヤーはタスクを完了し、小道具を収集することで孵化機のレベルを向上させる必要があります。孵化機のレベルは孵化速度と孵化成功率を決定します。 3. プレイヤーはゲームに参加する必要がある孵化に必要なリソースを収集します。

携帯電話が人々の日常生活において重要なツールになるにつれて、フォント サイズの設定は重要なパーソナライゼーション要件になりました。さまざまなユーザーのニーズを満たすために、この記事では、簡単な操作で携帯電話の使用体験を向上させ、携帯電話のフォントサイズを調整する方法を紹介します。携帯電話のフォント サイズを調整する必要があるのはなぜですか - フォント サイズを調整すると、テキストがより鮮明で読みやすくなります - さまざまな年齢のユーザーの読書ニーズに適しています - フォント サイズを使用すると、視力の悪いユーザーにとって便利です携帯電話システムの設定機能 - システム設定インターフェイスに入る方法 - 設定インターフェイスで「表示」オプションを見つけて入力します。 - 「フォント サイズ」オプションを見つけて、サードパーティでフォント サイズを調整します。アプリケーション - フォント サイズの調整をサポートするアプリケーションをダウンロードしてインストールします - アプリケーションを開いて、関連する設定インターフェイスに入ります - 個人に応じて

スマートフォンの普及に伴い、携帯フィルムは欠かせないアクセサリーの一つとなりました。耐用年数を延ばすには、携帯電話の画面を保護する適切な携帯電話フィルムを選択してください。この記事では、読者が自分に最適な携帯電話フィルムを選択できるように、携帯電話フィルムを購入する際のいくつかのポイントとテクニックを紹介します。携帯電話フィルムの素材と種類を理解する:PET フィルム、TPU など。 携帯電話フィルムは強化ガラスを含むさまざまな素材でできています。 PETフィルムは比較的柔らかく、強化ガラスフィルムは耐傷性に優れ、TPUは耐衝撃性能に優れています。選択する際は、個人の好みやニーズに基づいて決定できます。画面の保護の程度を考慮してください。携帯電話のフィルムの種類によって、画面の保護の程度も異なります。 PETフィルムは主に傷防止の役割を果たしますが、強化ガラスフィルムは落下耐性に優れています。より良いものを選ぶことができます

再帰関数は、文字列処理の問題を解決するためにそれ自体を繰り返し呼び出す手法です。無限再帰を防ぐために終了条件が必要です。再帰は、文字列の反転や回文チェックなどの操作で広く使用されています。

1. SUM 関数は、列またはセルのグループ内の数値を合計するために使用されます (例: =SUM(A1:J10))。 2. AVERAGE 関数は、列またはセルのグループ内の数値の平均を計算するために使用されます (例: =AVERAGE(A1:A10))。 3. COUNT 関数。列またはセルのグループ内の数値またはテキストの数をカウントするために使用されます。例: =COUNT(A1:A10)。 4. IF 関数。指定された条件に基づいて論理的な判断を行い、結果を返すために使用されます。対応する結果。

再帰は、問題を解決するために関数自体を呼び出すことを可能にする強力な手法です。C++ では、再帰関数は、基本ケース (再帰をいつ停止するかを決定する) と再帰呼び出し (問題を分割する) という 2 つの重要な要素で構成されます。より小さなサブ問題)。基本を理解し、階乗計算、フィボナッチ数列、バイナリ ツリー トラバーサルなどの実践的な例を練習することで、再帰的な直感を構築し、自信を持ってコードで使用することができます。

末尾再帰最適化 (TRO) は、特定の再帰呼び出しの効率を向上させます。末尾再帰呼び出しをジャンプ命令に変換し、コンテキスト状態をスタックではなくレジスターに保存することで、余分な呼び出しとスタックへの戻り操作を排除し、アルゴリズムの効率を向上させます。 TRO を使用すると、末尾再帰関数 (階乗計算など) を最適化できます。末尾再帰呼び出しを goto ステートメントに置き換えることで、コンパイラーは goto ジャンプを TRO に変換し、再帰アルゴリズムの実行を最適化します。
