假設有這樣的問題。給乙個如下資料結構的資料。然後求id=01001002
的text
值。
var tree = [,]}]
},] }]
}];
這是個很明顯的多叉樹的樹形結構,一般情況下,對於這種樹形結構一般採用深度優先遍歷和廣度優先遍歷。深度優先遍歷的原則是:
1. 從頂點開始;
2. 如果當前節點有子節點,則遍歷當前節點的所有子節點;
// 遞迴實現
function
deepsearch
(tree)
}}// 非遞迴
function
deepsearch
(tree)
console.log(temp);
}}
回到我們的問題,我們可以給出以下兩種解法:
// 遞迴
function
deepquery
(tree,id)
if(id === tree[i].id || isget) }}
deepsearch(tree,id);
return retnode;
}// 非遞迴
function
deepquery
(tree, id)
if(id === temp.id)
}}
遞迴沒辦法及時跳出迴圈,所以在外面定義乙個標記為,表示有沒有找到要搜尋的結果,如果找到,則跳出後續的迴圈。非遞迴的直接找到結果的時候return就行。廣度優先遍歷的原則是:
1. 從根節點開始;
2. 遍歷所有子節點;
3. 從第乙個子節點開始再執行廣度優先遍歷。
**如下:
function
breadthsearch
(tree)
console.log(temp);
}}
針對我們的問題的解法:
function
breadthquery
(tree, id)
if(temp.id === id)
}}
當資料沒有規則的時候,我們通常只能使用遍歷的方式來搜尋我們想要的資料。但是假設我們的資料有這樣的特點:
1. id由八位數字構成;
2. 1-2位表示省;
3. 3-5位表示市;
4. 6-8位表示縣;
5. 預設用0代替,比如北京的省級的id
是1
,則北京這個省級區域的id
的為01000000
。
則這時候給我們乙個id,我們就可以快速獲得他的各個層級的id了,以便於快速定位。這種方式只適合於那種層級固定的且id有一定規則的資料。
樹形資料轉換
測試資料 create table project id int,name nvarchar 20 parent id int insert project select 1,所有專案 null union all select 2,專案1 1 union all select 3,專案2 1 cr...
樹形資料轉換
測試資料 create table project id int,name nvarchar 20 parent id int insert project select 1,所有專案 null union all select 2,專案1 1 union all select 3,專案2 1 cr...
樹形資料轉換
測試資料 create table project id int,name nvarchar 20 parent id int insert project select 1,所有專案 null union all select 2,專案1 1 union all select 3,專案2 1 cr...