在树中(逻辑上为DB)包含
形式的项目
- 列出项目A
- 列出项目B.
- 列出项目C.
- 列出项目D
- 列出项目E
- 列出项目F.
醇>
- 列出项目G
等等(嵌套深度不受限制),我希望从任意节点开始向下(或向上)获取下一个节点。
让我们说List Item D
,我想写一个函数GetNextNode()
,它将返回List Item E
。
我的想法是做一些递归的东西,但也许有一种更聪明的方法来处理它?</ p>
我的问题:
你会如何解决这个问题?
编辑1:
可以使用以下函数访问树:
GetParentNode()
GetChildrenNodes()
GetNextSiblingNode()
所以它类似于例如e Windows窗体TreeView
。
答案 0 :(得分:5)
我必须多次这样做。来自记忆:
public Node GetBelowNode()
{
if (GetChildrenNodes().count > 0)
return GetChildrenNodes()[0];
else
if (GetNextSiblingNode() != null)
return GetNextSiblingNode();
else
{
Node curr = this;
Node parent;
while (true)
{
parent = curr.GetParentNode();
if (parent == null)
return null;
else
{
if (parent.GetNextSiblingNode() != null)
return parent.GetNextSiblingNode();
else
curr = parent;
}
}
}
}
答案 1 :(得分:1)
您可以通过递归或...最差xD
来处理此问题我认为只有3个基本案例:
private string getNext(TreeNode node)
{
if (node.FirstNode != null)
{
return node.FirstNode.Name;
}
else
{
if (node.NextNode != null)
{
return node.NextNode.Name;
}
else if (node.Parent.NextNode != null)
{
return node.Parent.NextNode.Name;
}
}
return "";
}
这不适用于所有情况。您也应该搜索父节点的下一个节点。感谢Vincent Vancalbergh的评论; - )
答案 2 :(得分:1)
public Party Next {
get {
if (this.children.Count > 0) return this.children[0];
Party target = this;
do {
if (target.NextSibling != null) return target.NextSibling;
} while ((target = target.Parent) != null);
return null;
}
}
public Party Previous {
get {
if (Parent != null && Parent.children.Count > 0 && this == Parent.children[0]) {
return Parent;
}
Party target = this;
do {
if (target.PreviousSibling != null) { target = target.PreviousSibling; break; }
} while ((target = target.Parent) != null);
if (target != null) {
while (target.children.Count > 0) {
target = target.children[target.children.Count - 1];
}
}
return target;
}
}
答案 3 :(得分:0)
尝试这个:
TreeNode currentNode = treeView1.SelectedNode;
treeView1.selectedNode = currentNode.NextNode;
答案 4 :(得分:0)
由于我对“向下”部分得到了很好的回复,我将添加自己的“向上”部分。也许这是为了你的一些帮助;上部类似于:
- 获取上一个兄弟姐妹。
- 如果是以前的兄弟,请获取此最深的子节点 兄弟节点。
- 如果没有以前的兄弟姐妹,请获取直接父母。
醇>
为了获得最深的兄弟(2.),我使用以下代码:
function getDeepestChild( page )
dim result
set result = nothing
dim childPages
set childPages = page.ChildPages
if childPages.Count>0 then
dim p
set p = childPages(childPages.Count-1)
' recurse.
set result = getDeepestChild( p )
else
set result = page
end if
set getDeepestChild = result
end function
(是的,我知道这是VBScript;我实际上用这种语言需要它)