asp.net 递归获取子节点问题

asp.net 递归获取子节点问题,第1张

GetTree(int lmid)

{

NodeList = 在数据库中搜索以lmid为父节点的节点;

for i=NodeListbegin() to NodeListend()

{

Node = NodeList[i];

NodeChildList = GetTree(Nodelm_id);

}

return NodeList;

}

调用的时候GetTree(0)

这个是伪码,你自己改成实际代码吧,最后组成的是栏目树

树的定义

树(tree)是包含n(n>0)个结点的有穷集合,其中:

(1)每个元素称为结点(node);

(2)有一个特定的结点被称为根结点或树根(root)。

(3)除根结点之外的其余数据元素被分为m(m≥0)个互不相交的结合T1,T2,……Tm-1,其中每一个集合Ti(1<=i<=m)本身也是一棵树,被称作原树的子树(subtree)。

树也可以这样定义:树是有根结点和若干颗子树构成的。树是由一个集合以及在该集合上定义的一种关系构成的。集合中的元素称为树的结点,所定义的关系称为父子关系。父子关系在树的结点之间建立了一个层次结构。在这种层次结构中有一个结点具有特殊的地位,这个结点称为该树的根结点,或称为树根。

我们可以形式地给出树的递归定义如下:

单个结点是一棵树,树根就是该结点本身。

设T1,T2,,Tk是树,它们的根结点分别为n1,n2,,nk。用一个新结点n作为n1,n2,,nk的父亲,则得到一棵新树,结点n就是新树的根。我们称n1,n2,,nk为一组兄弟结点,它们都是结点n的子结点。我们还称n1,n2,,nk为结点n的子树。

空集合也是树,称为空树。空树中没有结点

这是以前写的,可以参考一下!

treeView里面实现数据绑定

DataSet ds;

protected void Page_Load(object sender, EventArgs e)

{

if (!IsPostBack)

{

//以下是绑定数据

SqlConnection con = new

SqlConnection("server=;database=Test;uid=sa;pwd=sa");

SqlDataAdapter adapter = new SqlDataAdapter("select  from TreeViewTest", con);

ds = new DataSet();

adapterFill(ds, "TreeViewTest");

//初始化TreeView :TreeView1Nodes:表示TreeView1的节点集合 ,"0"表示的是最顶上节点没有父节点

InitTree(TreeView1Nodes, "0");

}

}

/// <summary>

/// 初始化TreeView

/// </summary>

/// <param name="Nds">TreeNodeCollection:节点的集合</param>

/// <param name="parentId">parentId:某一节点的父节点ID</param>

private void InitTree(TreeNodeCollection Nds, string parentId)

{

DataView dv = new DataView();

TreeNode tmpNd;

//string intId;

dvTable = dsTables["TreeViewTest"];

//筛选出 ParentId父节点ID为传入值parentId的所有的数据行 为"0"时表时选出所有的顶节点数据行

dvRowFilter = "ParentId='" + parentId + "'";

//将筛选出的所有的数据行添加到节点

foreach (DataRowView drv in dv)

{

tmpNd = new TreeNode();

tmpNdValue = drv["NodeId"]ToString();

tmpNdText = drv["NodeName"]ToString();

NdsAdd(tmpNd);

//判断是不是存在drv["NodeId"]的ChildNodes,存在的话添加,不存在就继续遍历

DataView dvTemp = new DataView();

dvTempTable = dsTables["TreeViewTest"];

dvTempRowFilter = "ParentId='" + drv["NodeId"]ToString() + "'";

if (dvTempCount != 0)

{

InitTree(tmpNdChildNodes, tmpNdValue);

}

}

}

叶子节点:没有孩子节点的节点

下面我给出两种求解思路,其中就包括你要的递归求解。Java版的示例代码如下:

package cnzifangskytreebinarytreequestions;

import orgjunitTest;

import cnzifangskyqueueLinkQueue;

import cnzifangskytreebinarytreeBinaryTreeNode;

/

  求二叉树中叶子节点的个数

  @author zifangsky

 

 /

public class Question2 {

/

  通过递归遍历获取叶子节点个数

  

  @时间复杂度 O(n)

  @param root

  @return

 /

public int getNumberOfLeavesByPreOrder(BinaryTreeNode<Integer> root){

if(root == null){

return 0;

}else{

if(rootgetLeft() == null && rootgetRight() == null){ //叶子节点

return 1;

}else{ //左子树叶子节点总数 + 右子树叶子节点总数

return getNumberOfLeavesByPreOrder(rootgetLeft()) + getNumberOfLeavesByPreOrder(rootgetRight());

}

}

}

/

  使用层次遍历获取二叉树叶子节点个数

  

  @时间复杂度 O(n)

  @param root

 /

public int getNumberOfLeavesByQueue(BinaryTreeNode<Integer> root){

int count = 0; //叶子节点总数

LinkQueue<BinaryTreeNode<Integer>> queue = new LinkQueue<>();

if(root != null){

queueenQueue(root);

}

while (!queueisEmpty()) {

BinaryTreeNode<Integer> temp = queuedeQueue(); //出队

//叶子节点:左孩子节点和右孩子节点都为NULL的节点

if(tempgetLeft() == null && tempgetRight() == null){

count++;

}else{

if(tempgetLeft() != null){

queueenQueue(tempgetLeft());

}

if(tempgetRight() != null){

queueenQueue(tempgetRight());

}

}

}

return count;

}

/

  测试用例

 /

@Test

public void testMethods(){

/

  使用队列构造一个供测试使用的二叉树

      1

    2    3

  4  5  6  7

    8 9  

 /

LinkQueue<BinaryTreeNode<Integer>> queue = new LinkQueue<BinaryTreeNode<Integer>>();

BinaryTreeNode<Integer> root = new BinaryTreeNode<>(1); //根节点

queueenQueue(root);

BinaryTreeNode<Integer> temp = null;

for(int i=2;i<10;i=i+2){

BinaryTreeNode<Integer> tmpNode1 = new BinaryTreeNode<>(i);

BinaryTreeNode<Integer> tmpNode2 = new BinaryTreeNode<>(i+1);

temp = queuedeQueue();

tempsetLeft(tmpNode1);

tempsetRight(tmpNode2);

if(i != 4)

queueenQueue(tmpNode1);

queueenQueue(tmpNode2);

}

Systemoutprintln("叶子节点个数是:" + getNumberOfLeavesByPreOrder(root));

Systemoutprintln("叶子节点个数是:" + getNumberOfLeavesByQueue(root));

}

}

输出如下:

叶子节点个数是:5

叶子节点个数是:5

附:上面代码中用到的两个类的定义:

i)BinaryTreeNodejava:

package cnzifangskytreebinarytree;

/

  二叉树的单个节点定义

  @author zifangsky

 

  @param <K>

 /

public class BinaryTreeNode<K extends Object> {

private K data; // 数据

private BinaryTreeNode<K> left; //左孩子节点

private BinaryTreeNode<K> right; //右孩子节点

public BinaryTreeNode(K data) {

thisdata = data;

}

public BinaryTreeNode(K data, BinaryTreeNode<K> left, BinaryTreeNode<K> right) {

thisdata = data;

thisleft = left;

thisright = right;

}

public K getData() {

return data;

}

public void setData(K data) {

thisdata = data;

}

public BinaryTreeNode<K> getLeft() {

return left;

}

public void setLeft(BinaryTreeNode<K> left) {

thisleft = left;

}

public BinaryTreeNode<K> getRight() {

return right;

}

public void setRight(BinaryTreeNode<K> right) {

thisright = right;

}

}

ii)LinkQueuejava:

package cnzifangskyqueue;

import cnzifangskylinkedlistSinglyNode;

/

  基于单链表实现的队列

  @author zifangsky

  @param <K>

 /

public class LinkQueue<K extends Object> implements Queue<K>{

private SinglyNode<K> frontNode; //队首节点

private SinglyNode<K> rearNode; //队尾节点

public LinkQueue() {

frontNode = null;

rearNode = null;

}

/

  返回队列是否为空

  @时间复杂度 O(1)

  @return

 /

@Override

public boolean isEmpty(){

return (frontNode == null);

}

/

  返回存储在队列的元素个数

  @时间复杂度 O(n)

  @return

 /

@Override

public int size(){

int length = 0;

SinglyNode<K> currentNode = frontNode;

while (currentNode != null) {

length++;

currentNode = currentNodegetNext();

}

return length;

}

/

  入队:在链表表尾插入数据

  @时间复杂度 O(1)

  @param data

 /

@Override

public void enQueue(K data){

SinglyNode<K> newNode = new SinglyNode<K>(data);

if(rearNode != null){

rearNodesetNext(newNode);

}

rearNode = newNode;

if(frontNode == null){

frontNode = rearNode;

}

}

/

  出队:删除表头节点

  @时间复杂度 O(1)

  @return

 /

@Override

public K deQueue(){

if(isEmpty()){

throw new RuntimeException("Queue Empty!");

}else{

K result = frontNodegetData();

if(frontNode == rearNode){

frontNode = null;

rearNode = null;

}else{

frontNode = frontNodegetNext();

}

return result;

}

}

/

  返回队首的元素,但不删除

  @时间复杂度 O(1)

 /

@Override

public K front() {

if(isEmpty()){

throw new RuntimeException("Queue Empty!");

}else{

return frontNodegetData();

}

}

/

  遍历队列

  @时间复杂度 O(n)

  @return

 /

@Override

public void print() {

SinglyNode<K> tmpNode = frontNode;

while (tmpNode != null) {

Systemoutprint(tmpNodegetData() + " ");

tmpNode = tmpNodegetNext();

}

}

/

  删除整个队列

  @时间复杂度 O(1)

  @return

 /

@Override

public void deleteQueue() {

frontNode = null;

rearNode = null;

}

}

iii)SinglyNodejava:

package cnzifangskylinkedlist;

/

  单链表的定义

  

  @author zifangsky

  @param <K>

 /

public class SinglyNode<K extends Object> {

private K data; // 数据

private SinglyNode<K> next; // 该节点的下个节点

public SinglyNode(K data) {

thisdata = data;

}

public SinglyNode(K data, SinglyNode<K> next) {

thisdata = data;

thisnext = next;

}

public K getData() {

return data;

}

public void setData(K data) {

thisdata = data;

}

public SinglyNode<K> getNext() {

return next;

}

public void setNext(SinglyNode<K> next) {

thisnext = next;

}

@Override

public String toString() {

return "SinglyNode [data=" + data + "]";

}

}

以上就是关于asp.net 递归获取子节点问题全部的内容,包括:asp.net 递归获取子节点问题、请给出树的递归定义。、怎么用递归 绑定数据库 显示在treeview中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/10140847.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存