我在javascript中查找了树结构的基本格式:
function Tree(parent, child, data) {
this.parent = parent;
this.children = child || [];
this.data = data;
this.addNode ...
this.addChild ...
}
我遇到的问题是制作一棵“长”的树。我正在使用的数据是一条路径上的街道列表,这条路径几乎是一条直线路径,但是在路径中有一些小的分裂,数据看起来像:
A ->
B ->
C ->
D -> E,F
E ->
G ->
H
F -> I
I -> J
J -> K,L
K ->
M ->
N
L -> O
O -> P
我想避免看起来像这样的代码:
tree.children[0].children[0].children[0].addNode("E");
tree.children[0].children[0].children[0].push("F");
所以我的一个问题是如何遍历树,简单地说一下?
node = tree;
while(node.children != null)
node = node.children[0];
如果你可以帮助我,我会很感激,谢谢,
mathacka
答案 0 :(得分:7)
这种结构最可管理的方法是恕我直言,使用链接列表。
function Node(parentNode)
{
this.Parent=parentNode;
this.FirstChild=null;
this.LastChild=null;
this.PreviousSibling=null;
this.NextSibling=null;
}
Node.prototype.AddChild=function(child)
{
child.Parent = this;
child.PreviousSibling = this.LastChild;
if (this.LastChild != null)
this.LastChild.NextSibling = child;
this.LastChild = child;
if (this.FirstChild == null)
this.FirstChild = child;
}
要遍历孩子,请执行以下操作:
function GetChildren(node)
{
var result=new Array();
var child=node.FirstChild;
while(child)
{
result.push(child);
child=child.NextSibling;
}
return result;
}
(编辑)“节点” - 对象只是一个示例,它应该添加有意义的属性。使用它作为树中所有对象的基础,它可以具有任何深度而不会使其更复杂。您可以添加更多功能,例如GetChildByName,RemoveChild等。
答案 1 :(得分:2)
var Tree = function () {
Tree.obj = {};
return Tree;
};
// Parent Will be object
Tree.AddChild = function (parent, child) {
if (parent === null) {
if (Tree.obj.hasOwnProperty(child)) {
return Tree.obj[child];
} else {
Tree.obj[child] = {};
return Tree.obj[child];
}
} else {
parent[child] = {};
return parent[child];
}
};
// Uses
// Inserting -
var t = Tree();
var twoDoor = t.AddChild(null, "2 Door");
var fdoor = t.AddChild(null, "4 Door");
t.AddChild(fdoor, "manual");
t.AddChild(twoDoor, "automatic");
var man = t.AddChild(twoDoor, "manual");
t.AddChild(man, "Extended Cab");
console.log(t.obj);
答案 2 :(得分:1)
看看这种方法如何从SQL查询创建树结构:
http://blog.tcs.de/creating-trees-from-sql-queries-in-javascript/
答案 3 :(得分:0)
如果要在树中的每个节点上进行一些计算,那么可以向树节点添加traverse
函数,如:
Tree.prototype.traverse = function( operation ){
// call the operation function and pass in the current node
operation( this )
// call traverse on every child of this node
for( var i=0; i<this.children.length; i++ )
this.children[i].traverse( operation )
}
// an example operation that finds all the leaf nodes
var leaves = []
myTree.traverse( function( node ){
if( !node.children.length )
leaves.push(node)
}
或者,如果您正在执行更具体的操作,例如操纵树或查找特定节点,那么您可能需要查看Visitor Design Pattern。