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中等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)