<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="author" content="心夢緣ocean ocl" />
<title>My tree demo</title>
<style type="text/css">
/*主頁面樣式*/
.leftNav {
width: 20%;
height:500px;
border:#B9E0F7 1px solid;
margin-left: 1%;
margin-right: 1%;
}
#footer {
color:#808080;
line-height: 1.6em;
padding: 0 0 1em 0;
}
/*我的樹樣式表*/
.treeDiv {
color: #636363;
font-size: 14px;
font-weight: normal;
background-color: #fff;
color: black;
overflow: auto;
padding: 0 0 1em 0;
overflow-x: hidden;
}
.treeNode {
white-space: nowrap;
text-indent: -14px;
margin: 6px 2px 5px 14px;
}
a.treeUnselected:hover, a.treeSelected:hover {
background-color: #BFD9ED;
text-decoration: none;
}
a.treeUnselected, a.treeSelected {
color: black;
padding: 1px 3px 1px 0;
text-decoration: none;
}
a.treeSelected {
background-color: #B9E0F7;
}
a.treeUnselected {
background-color: transparent;
}
.treeSubnodes {
display: block;
}
.treeSubnodesHidden {
display: none;
}
.treeNode img.treeNoLinkImage, .treeNode img.treeLinkImage {
height: 15px;
margin-left: 5px;
margin-right: 0px;
width: 15px;
}
.treeNode img.treeLinkImage {
cursor: pointer;
}
div.treeNode a, div.treeNode span.apiRoot {
display: inline-block;
margin-left: 24px;
text-indent: 0;
white-space: normal;
width: 95%;
word-wrap: break-word;
}
div.treeNode span.category {
cursor: pointer;
}
</style>
</head>
<body>
<div class="leftNav">
<div id="samplesToc">
<div id="tree" style="top: 35px; left: 0px;" class="treeDiv">
<div id="treeRoot" onselectstart="return false" ondragstart="return false">
<div class="treeNode">
<img src="../graphics/treenodeplus.gif" onclick="expandCollapse(this.parentNode)" class="treeLinkImage">
<span onclick="expandCollapse(this.parentNode)" class="category">目錄節點一 </span>
<div class="treeSubnodesHidden">
<div class="treeNode">
<img src="../graphics/treenodeplus.gif" onclick="expandCollapse(this.parentNode)" class="treeLinkImage">
<span onclick="expandCollapse(this.parentNode)" class="category">目錄節點一子目錄 </span>
<div class="treeSubnodesHidden">
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">二級葉子結點一</a>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">二級葉子結點二</a>
</div>
</div>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點一</a>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點二</a>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點三</a>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點四</a>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點五</a>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點六</a>
</div>
</div>
</div>
<!--end block-->
<div class="treeNode">
<img src="../graphics/treenodeplus.gif" onclick="expandCollapse(this.parentNode)" class="treeLinkImage">
<span onclick="expandCollapse(this.parentNode)" class="category">目錄節點二</span>
<div class="treeSubnodesHidden">
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點一</a>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點二</a>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點三</a>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點四</a>
</div>
<div class="treeNode">
<a href="#" class="treeUnselected" onclick="clickAnchor(this)">葉子結點五</a>
</div>
</div>
</div>
<!--end block-->
</div>
</div>
</div> <!-- end samplesToc -->
</div> <!-- end leftNav -->
<div class="right content">
</div><!-- end main content-->
<div id="footer" align="center">
</div><!-- end footer-->
<script type="text/javascript">
var treeSelected = null;//選中的樹節點
var imgPlus = new Image();
imgPlus.src="../graphics/treenodeplus.gif";
var imgMinus = new Image();
imgMinus.src="../graphics/treenodeminus.gif";
//父節點展開事件
function expandCollapse(el)
{
//如果父節點有位元組點(class 屬性為treeSubnodesHidden),展開所有子節點
if (el.className!= "treeNode"){
return; //判斷父節點是否為一個樹節點,如果樹節點不能展開,請檢查是否節點的class屬性是否為treeNode
}
var child;
var imgEl;//圖片子節點,在樹展開時更換圖片
for(var i=0; i < el.childNodes.length; i++)
{
child = el.childNodes[i];
if (child.src)
{
imgEl = child;
}
else if (child.className == "treeSubnodesHidden")
{
child.className = "treeSubnodes";//原來若隱藏,則展開
imgEl.src = imgMinus.src;//更換圖片
break;
}
else if (child.className == "treeSubnodes")
{
child.className = "treeSubnodesHidden";//原來若展開,則隱藏
imgEl.src = imgPlus.src;//更換圖片
break;
}
}
}
//子節點點擊事件,設置選中節點的樣式
function clickAnchor(el)
{
selectNode(el.parentNode);
el.blur();
}
function selectNode(el)
{
if (treeSelected != null)
{
setSubNodeClass(treeSelected, 'A', 'treeUnselected');
}
setSubNodeClass(el, 'A', 'treeSelected');
treeSelected = el;
}
function setSubNodeClass(el, nodeName, className)
{
var child;
for (var i=0; i < el.childNodes.length; i++)
{
child = el.childNodes[i];
if (child.nodeName == nodeName)
{
child.className = className;
break;
}
}
}
</script>
</body>
</html>
運行效果:
⑵ js樹結構數據的遍歷
title: JS樹結構數據的遍歷
date: 2022-04-14
description: 針對項目中出現樹形結構數據的時候,我們怎樣去操作他
項目中我們會經常出現對樹形結構的遍歷、查找和轉換的場景,比如說DOM樹、族譜、社會機構、組織架構、許可權、菜單、省市區、路由、標簽等等。那針對這些場景和數據,我們又如何去遍歷和操作,有什麼方式或者技巧可以簡化我們的實現思路。下面我們將針對常規出現的場景去總結一下我們的遍歷方式
樹的特點
1、每個節點都只有有限個子節點或無子節點;
2、沒有父節點的節點稱為根節點;
3、每一個非根節點有且只有一個父節點;
4、除了根節點外,每個子節點可以分為多個不相交的子樹;
5、樹裡面沒有環路
下面的圖片表示一顆樹
在下面的JS中我們由多棵樹組成我們的數據
在這數據中我們如何評判數據是否為葉節點(也就是最後一級),我們每個節點都會存在children屬性,如果不存在children屬性或者children不是一個數組或者children為數組且長度為0我們則認為他是一個葉節點
我們針對樹結構的操作離不開遍歷,遍歷的話又分為廣度優先遍歷、深度優先遍歷。其中深度優先遍歷可以通過遞歸和循環的方式實現,而廣度優先遍歷的話是非遞歸的
從上往下對每一層依次訪問,在每一層中,從左往右(也可以從右往左)訪問結點,訪問完一層就進入下一層,直到沒有結點可以訪問為止。即訪問樹結構的第n+1層前必須先訪問完第n層。
簡單的說,BFS是從根節點開始,沿著樹的寬度遍歷樹的節點。如果所有節點均被訪問,則演算法中止。
所以我們的實現思路是,維護一個隊列,隊列的初始值為樹結構根節點組成的列表,重復執行以下步驟直到隊列為空:
取出隊列中的第一個元素,進行訪問相關操作,然後將其後代元素(如果有)全部追加到隊列最後。
深度優先搜索演算法(英語:Depth-First-Search,DFS)是一種用於遍歷或搜索樹或圖的演算法。這個演算法會盡可能深的搜索樹的分支。當節點v的所在邊都己被探尋過,搜索將回溯到發現節點v的那條邊的起始節點。這一過程一直進行到已發現從源節點可達的所有節點為止。如果還存在未被發現的節點,則選擇其中一個作為源節點並重復以上過程,整個進程反復進行直到所有節點都被訪問為止
1、先序遍歷
訪問子樹的時候,先訪問根再訪問根的子樹
2、後序遍歷
訪問子樹的時候,先訪問子樹再訪問根
1、先序遍歷
先序遍歷與廣度優先循環實現類似,要維護一個隊列,不同的是子節點不追加到隊列最後,而是加到隊列最前面
2、後序遍歷
後序遍歷就略微復雜一點,我們需要不斷將子樹擴展到根節點前面去,執行列表遍歷,並且通過一個臨時對象維護一個id列表,當遍歷到某個節點如羨大果它沒有子節點或者它本身已經存在於我們的臨時id列表,則執行訪問操笑高作,否則繼續擴展子節點到當前節點前面
對於樹結構的遍歷操作,其實遞歸是最基礎,也是最容易理解的。遞歸本身就是循環的思想,所以可以用循環來改寫遞碰派尺歸,以上的方式在項目中已經廊括了大部分的場景了,我們在日常開發中可以根據場景或者需要去選擇我們的遍歷方式,或者基於此對他進行調整和優化,至於每種方式的空間復雜度和時間復雜度我們在這個地方就不去嘗試了,各位感興趣可以自己去驗證。
廣度優先搜索
樹的遍歷
深度優先搜索
圖文詳解兩種演算法:深度優先遍歷(DFS)和廣度優先遍歷(BFS)
二叉樹遍歷(前序,後序,中序,層次)遞歸與迭代實現JavaScript
JS樹結構操作:查找、遍歷、篩選、樹和列表相互轉換
⑶ JSP網頁中中那種目錄樹是怎麼實現的
用dtree很方便,我最近也是做這種目錄樹
JS創建
var tree = new dTree('tree');
tree.add(10,0,'空間信息管理','goto(10)','','_c');
tree.add(11,10,'翠苑1區','goto(2)','單擊查看該群組的信息','k');
tree.add(12,10,'翠苑2區','goto(2)','單擊查看該群組的信息','FRAME_LIST');
tree.add(13,12,'第1棟','goto(3)','單擊查看該群組的信息','FRAME_LIST');
tree.add(19,13,'第1單元','goto(3)','單擊查看該群組的信息','FRAME_LIST');
tree.add(14,19,'第1層','goto(3)','單擊查看該群組的信息','FRAME_LIST');
tree.add(15,14,'1號房','goto(1)','單擊查看該群組的信息','FRAME_LIST');
tree.add(17,11,'第1棟','goto(3)','單擊查看該群組的信息','FRAME_LIST');
tree.add(18,11,'第2棟','goto(3)','單擊查看該群組的信息','FRAME_LIST');
tree.add(20,17,'第1單元','goto(3)','單擊查看該群組的信息','FRAME_LIST');
tree.add(21,17,'第2單元','goto(3)','單擊查看該群組的信息','FRAME_LIST');
tree.add(22,18,'第1單元','goto(3)','單擊查看該群組的信息','FRAME_LIST');
tree.add(23,18,'第2單元','goto(3)','單擊查看該群組的信息','FRAME_LIST');
tree.add(16,10,'嘉綠名苑','goto(2)','單擊查看該群組的信息','FRAME_LIST');
然後在需要的位置這樣調用<script type="text/javascript">document.write(tree);</script>
⑷ 用php做的網盤,網盤頁面用的是js,但是登陸上之後,頁面的目錄樹總是不顯示,請高手指教啊!
JS是客戶端解釋執行的,不存在跨平台問題,只跟瀏覽器相關。
檢查一下文件拷貝完整沒有,還有調用路徑是否正確
⑸ jsp 和 html 怎麼實現樹型目錄結構
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>製作簡單的樹形菜單</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<style type="text/css">
body{font-size:13px;
line-height:20px;
}
a{font-size: 13px;
color:blue;
text-decoration: none;
}
a:hover{font-size:13px;
color:red;
}
.no_circle{list-style-type:none; /*設置列表項標志的類型為無*/
display:none;
}
</style>
<script type="text/javascript">
function show(){
if(document.getElementById("a").style.display=='block'){
document.getElementById("a").style.display='none'; //觸動的ul如果處於顯示狀態,即隱藏
}
else{
document.getElementById("a").style.display='block'; //觸動的ul如果處於隱藏狀態,即顯示
}
}
</script>
</head>
<body>
<b>樹形菜單:</b>
<ul><a href="javascript:onclick=show() ">網路</a></ul>
<ul id="a" class="no_circle">
<li>新聞</li>
<li>網頁</li>
<li>圖片</li>
<li>貼吧</li>
<li>知道</li>
</ul>
</body>
</html>
⑹ 求js高手做個的輸入框的目錄樹
我隨便的編寫了一個思路,其它的你去搞定!
<span style="display:inline-block;background:#FF0000">共<input name="A" type="text" style="width:40px;" onkeyup="createInput(this)"/>年級</span>
<script>
function getPosition(obj){
var left=0;if(obj){while (obj.offsetParent){left += obj.offsetLeft;obj = obj.offsetParent;}}return left;
}
function createInput(obj){
var ml=getPosition(obj.parentNode)
var div=document.createElement("div");
div.style.marginLeft=ml+obj.parentNode.clientWidth;
div.style.tableLayout="fixed";
div.style.whiteSpace="nowrap";
var str="";
for(var i=1;i<=obj.value;i++){
str+="<span><input type='text' style='width:80px'><input type='text' style='width:40px' onkeyup='createInput(this)'></span><br>"
}
div.innerHTML=str;
obj.parentNode.insertAdjacentElement("afterEnd",div);
}
</script>
相信你懂得!
⑺ JS中的二叉樹遍歷
棧、隊列、鏈表等數據結構,都是順序數據結構。而樹是非順序數據結構。樹型結構是一類非常重要的非線性結構。直觀地,樹型結構是以分支關系定義的層次結構。
二叉樹(Binary Tree)是另一種樹型結構,它的特點是每個結點至多隻有兩棵子樹(即二叉樹中不存在度大於2的結點),並且,二叉樹的子樹有左右之分(其次序不能任意顛倒。)
遍歷二叉樹(Traversing Binary Tree):是指按指定的規律對二叉樹中的每個結點訪問一次且僅訪問一次。
二叉樹有深度遍歷和廣度遍歷, 深度遍歷有前序、 中序和後序三種遍歷方法。二叉樹的前序遍歷可以用來襲告顯示目錄結構等;中序遍歷可以實現表達式樹,在編譯器擾禪鏈底層很有用;後序遍歷可以用來實現計算目錄內的文件及其信息等。
上述二叉樹(a+b*c)-d/e在js中可以用對象的形式表示出來:
先遞歸遍歷左子樹,從最左的一個左子樹存入數組;然後回溯遍歷雙親結點,再是右子樹,這樣遞歸循環。
將當前結點壓入棧,然後將左子樹當做當前結點,如果當前結點為空,將雙親結點取出來,將值保存進數組,然後將右子樹當做當前結點,進行循環。
先走左子樹,緩孫當左子樹沒有孩子結點時,將此結點的值放入數組中,然後回溯遍歷雙親結點的右結點,遞歸遍歷。
廣度優先遍歷二叉樹(層序遍歷)是用隊列來實現的,廣度遍歷是從二叉樹的根結點開始,自上而下逐層遍歷;在同一層中,按照從左到右的順序對結點逐一訪問。
js 中二叉樹的深度遍歷與廣度遍歷(遞歸實現與非遞歸實現)
二叉樹與JavaScript
⑻ 怎麼用javascript獲取本地硬碟的目錄樹,然後在html頁面中顯示硬碟目錄樹
為了安全性,現在的瀏覽器廠商已經禁用了對本地磁碟文件操作的API。
最多可以寫點cookie到客戶端,而且限制還很多
所以只要是瀏覽器裡面的類似js這樣的腳本語言都是不能對客戶端的本地文件進行操控的