實作樹狀結構的兩種方法_PHP教程
實現樹狀結構的兩種方法
1。遞歸法
遞歸是指在函數中明確的呼叫它本身。
利用遞歸法實現樹狀結構的特徵是寫入資料速度較快,顯示速度較慢(在樹的分支/層次較多的情況下尤其明顯)。適用與寫入資料量大,樹的結構複雜的情況下。
資料結構(以mysql為例)
程式碼:------------------------------- -------------------------------------------------
CREATE TABLE `tree1` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`parentid` tinyint(3) unsigned NOTULL Ndefault's
KEY `parentid` (`parentid`)
) TYPE=MyISAM;
(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,記錄的id號
parentid,記錄的父記錄id(為0則為根記錄)
topic,記錄的顯示標題
顯示程式
順序樹:
PHP代碼:-------------------------------------- ------------------------------------------
/* 資料庫連線*/
mysql_connect();
mysql_select_db('tree');
/* 樹狀顯示的遞歸函數*/
function tree($parentid = 0) {
/*執行sql查詢,取得記錄的標題和id*/
$sql = "select topic,id from tree1 where parentid = $parentid order by id asc";
where parentid = $parentid order by id asc";
= mysql_query($sql);
/* 縮排*/
echo("");
");
while($ra = mysql_fetch_row($rs)) { echo('
/* 遞歸給*/
/* 遞歸給*/
🎜> }
echo("
}
tree();
?>
------------ -------------------------------------------------- ------------------
逆序樹:
PHP代碼:----------- -------------------------------------------------- -------------------
/* 資料庫連線*/
mysql_connect();
mysql_select_db('tree ');
/* 樹狀顯示的遞歸函數*/
function tree($parentid = 0) {
/*執行sql查詢,取得記錄的標題和id*/
$sql = "select topic,id from tree1 where parentid = $parentid order by id desc";
$rs = mysql_query($sql);
/* 縮排*/");
while($ra = mysql_fetch_row($rs)) {
/* 顯示記錄標題*/
/* 顯示記錄標題*/
/* 顯示記錄標題*/
li>');
/* 遞歸呼叫*/
tree($ra[1]);
}
🎜> tree();
?>
----------------------------------- ---------------------------------------------
插入資料程式
PHP代碼:---------------------------------- ----------------------------------------------
/* 資料庫連線*/
mysql_connect();
mysql_select_db('tree');
$sql = "insert into tree (topic,parentid) values('33 -1',3);";
mysql_query($sql);
?>
--------------------- -------------------------------------------------- ---------
2。排序字段法
此方法是透過在資料結構中增加一個標誌記錄在整個樹中的順序位置的字段來實現的。特點是顯示速度和效率高。但在單一樹的結構複雜的情況下,資料寫入效率不足。而且順序排列時候,插入,刪除記錄的演算法過於複雜,故通常用逆序排列。
資料結構(以mysql為例)
程式碼:---------------------------- -------------------------------------------------- --
CREATE TABLE `tree2` (
`id` tinyint(3) unsigned NOT NULL auto_increment,
`parentid` tinyint(3) unsigned NOT N N NM NLDL如何tinyint(3) unsigned NOT NULL default '0',
`layer` tinyint(3) unsigned NOT NULL default '0',
`orders` tinyint(3) unsigned NOT NULL ault ' > `topic` varchar(50) default NULL,
PRIMARY KEY (`id`),
KEY `parentid` (`parentid`),
KEY `parentid` (`parentid`),
KEY `parentid` (`parentid`),
KEY `parentid` (`parentid`),
KEY ``id``(`rootEY)(`YyKEY? ) TYPE=MyISAM
INSERT INTO `tree2` (`id`, `parentid`, `rootid`, `layer`, `orders`, `topic`) VALUES
,0,0,'樹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 where parentid = 0 order by id desc";
$rs = mysql_query($sql);
echo("");
");
$lay = 0;
while( $ra = mysql_fetch_row($rs)) {
echo("");
");
/* 選取此樹所有記錄,並依orders欄位排序*/
$ ,layer from tree2 where rootid = $ra[0] order by orders";
$rs1 = mysql_query($sql);
while($ra1 = mysql_fetch_row($rs1)) { if($ra1[1]>$lay) {
echo(str_repeat("",$ra1[1]-$layse); ra1[1] echo(str_repeat("
",$lay-$ra1[1]));
//echo("$ra1[1]>$lay");
echo("
$lay = $ra1[🎜> $lay = $ra1[1];
}
echo("
}
echo("
?>
------ -------------------------------------------------- ------------------------
插入資料程式
PHP代碼:----- -------------------------------------------------- -------------------------
/* 資料庫連線*/
mysql_connect();
mysql_select_db('tree');
/* 插入根記錄*/
$sql = "insert into tree2 (topic) values ('樹5')";
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 from tree2 where id = $parentid";
list($rootid,$layer,$orders) = mysql_fetch_row(mysql_query($sql));
/* 更新插入位置後記錄的orders值*/
$sql = " update tree2 set orders = orders 1 where orders > $orders";
mysql_query($sql);
/* 插入記錄*/
$sql = "insert into tree2 (rootid,parentid,orders,layerid,orders,layerid,orders,layerid,orders,layerid,orders,layerid,orders. ,topic) values ($rootid,$parentid,".($orders 1).",".($layer 1).",'樹2-1-1-2')";
mysql_query($ sql);?>
http://www.bkjia.com/PHPjc/314792.html
www.bkjia.com

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

而後悔莫及、人們常常會因為一些原因不小心刪除某些聯絡人、微信作為一款廣泛使用的社群軟體。幫助用戶解決這個問題,本文將介紹如何透過簡單的方法找回被刪除的聯絡人。 1.了解微信聯絡人刪除機制這為我們找回被刪除的聯絡人提供了可能性、微信中的聯絡人刪除機制是將其從通訊錄中移除,但並未完全刪除。 2.使用微信內建「通訊錄恢復」功能微信提供了「通訊錄恢復」節省時間和精力,使用者可以透過此功能快速找回先前刪除的聯絡人,功能。 3.進入微信設定頁面點選右下角,開啟微信應用程式「我」再點選右上角設定圖示、進入設定頁面,,

手機遊戲成為了人們生活中不可或缺的一部分,隨著科技的發展。它以其可愛的龍蛋形象和有趣的孵化過程吸引了眾多玩家的關注,而其中一款備受矚目的遊戲就是手機版龍蛋。幫助玩家們在遊戲中更好地培養和成長自己的小龍,本文將向大家介紹手機版龍蛋的孵化方法。 1.選擇合適的龍蛋種類玩家需要仔細選擇自己喜歡並且適合自己的龍蛋種類,根據遊戲中提供的不同種類的龍蛋屬性和能力。 2.提升孵化機的等級玩家需要透過完成任務和收集道具來提升孵化機的等級,孵化機的等級決定了孵化速度和孵化成功率。 3.收集孵化所需的資源玩家需要在遊戲中

字體大小的設定成為了重要的個人化需求,隨著手機成為人們日常生活的重要工具。以滿足不同使用者的需求、本文將介紹如何透過簡單的操作,提升手機使用體驗,調整手機字體大小。為什麼需要調整手機字體大小-調整字體大小可以使文字更清晰易讀-適合不同年齡段用戶的閱讀需求-方便視力不佳的用戶使用手機系統自帶字體大小設置功能-如何進入系統設置界面-在在設定介面中找到並進入"顯示"選項-找到"字體大小"選項並進行調整第三方應用調整字體大小-下載並安裝支援字體大小調整的應用程式-開啟應用程式並進入相關設定介面-根據個人

1. SUM函數,用於對一列或一組單元格中的數字進行求和,例如:=SUM(A1:J10)。 2、AVERAGE函數,用於計算一列或一組儲存格中的數字的平均值,例如:=AVERAGE(A1:A10)。 3.COUNT函數,用於計算一列或一組單元格中的數字或文字的數量,例如:=COUNT(A1:A10)4、IF函數,用於根據指定的條件進行邏輯判斷,並返回相應的結果。

尾遞歸最佳化(TRO)可提高特定遞歸呼叫的效率。它將尾遞歸呼叫轉換為跳轉指令,並將上下文狀態保存在暫存器中,而不是堆疊上,從而消除對堆疊的額外呼叫和返回操作,提高演算法效率。利用TRO,我們可以針對尾遞歸函數(例如階乘計算)進行最佳化,透過將tail遞歸呼叫替換為goto語句,編譯器會將goto跳轉移化為TRO,最佳化遞歸演算法的執行。

遞歸函數是一種在字串處理中反覆呼叫自身來解決問題的技術。它需要一個終止條件以防止無限遞歸。遞歸在字串反轉和回文檢查等操作中被廣泛使用。

遞歸定義及最佳化:遞歸:函數內部呼叫自身,解決可分解為更小子問題的難題。尾遞歸:函數進行所有計算後才進行遞歸調用,可最佳化為循環。尾遞歸最佳化條件:遞歸呼叫為最後操作。遞歸呼叫參數與原始呼叫參數相同。實戰範例:計算階乘:輔助函數factorial_helper實現尾遞歸最佳化,消除呼叫棧,提高效率。計算斐波那契數列:尾遞歸函數fibonacci_helper利用最佳化,高效率計算斐波那契數。

C++中的異常處理可透過自訂異常類別增強,提供特定錯誤訊息、上下文資訊以及根據錯誤類型執行自訂操作。定義繼承自std::exception的異常類,提供特定的錯誤訊息。使用throw關鍵字拋出自訂異常。在try-catch區塊中使用dynamic_cast將捕獲到的異常轉換為自訂異常類型。在實戰案例中,open_file函數會拋出FileNotFoundException異常,捕捉並處理該異常可提供更具體的錯誤訊息。
