java 找到一节点的所有子节点 是否得递归实现?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 找到一节点的所有子节点 是否得递归实现?相关的知识,希望对你有一定的参考价值。

对于一个节点来说id,其中包含若干个子节点的位置信息ArrayList loc,通过该位置信息可以找到该子节点的子节点信息,依此类推。
要求找到id的所有子节点,这是不是得用递归实现?
麻烦给出一个递归程序。
是不是只能用递归实现?
还有别的方法吗?
递归的程序不会写,高手帮忙。

2L谁说必须用递归的,只是递归写起来简单罢了,迭代的方法一样OK;
深度优先或者广度优先都可以
LZ的问题用迭代的方法可以这样解决:
1。把当前节点(需要查找字节点的节点)压入一个堆栈,这步是初始化;
2。从堆栈中弹出一个节点,如果该节点是叶子节点,则这条路已经走不通了,如果是非叶子节点,那就把这个节点的所有子节点压入堆栈
3。重复第二步直到堆栈为空
上面三步就能遍历当前节点的所有字节点

递归的话:
f(node)
for(遍历node的所有子节点)
child=当前子节点
if(child为叶子节点)
..return
;
else
f(child)


参考技术A 1.java对于树的节点查询,大多数都是用递归实现的。

但是,老板,你的问题描述也太不严谨了。。根本没法写出你要的程序。只能根据你的字面意义写点注意点。
链表的节点跟树不一样,链表的节点指向只能是唯一的,一个父亲可以有很多儿子,但一个儿子只有有一个父亲。所以只能是子节点指着父节点。
所以你的位置信息ArrayList(看名字应该是链表),起始都是子节点,指向它的父节点。对于节点A是不是节点B的父节点,按照你说的,应该只能把以B开始链表上所有的节点跟A比较,有A就说明B是A的节点,没有则不是。
大概的伪代码如下:
for(i=0,i<n,i++) --一共有n个链表
for(j=0,j<m,j++) ----m为当前链表的lenghth
if(note[i][j]==id) -----找到父节点,记录这个i,j
do something;
参考技术B 必须通过递归来实现 说白了就是自己调用自己
main()

f(1);
getch();

f(int a)

printf("%d",a);
while(a<=4);
f(++a);
printf("No%d",a);

这是一个简单的例子 充分体现出了递归调用
递归调用就是在自己的内部再调用自己呀 这有什么不会写的 做一个判断 如果发现了父节点 就调用自己来添加下一层的子节点
参考技术C //////////////今天刚写的一个重命名的小程序,里面有递归,看看吧

import java.io.*;

public class FileTest
/////////////////////////////起始目录 更改前的后缀 更改后的后缀
public static void renameAll(File file, String ext, String fext)
File [] files = file.listFiles();
for(File f: files)
if(f.isDirectory())
///如果是目录则递归调用自身
renameAll(f, ext, fext);

////是文件的话,改后缀
if(f.isFile())
String fileStr = f.toString();
if(fileStr.endsWith(ext))
int dotPoz = fileStr.indexOf(".");
fileStr = fileStr.substring(0, dotPoz + 1) + fext;
f.renameTo(new File(fileStr));






public static void main(String[] args)
//把f:/ftest目录下所有的以txt结尾的文件改成rar结尾的
FileTest.renameAll(new File("f:/ftest"), "txt", "rar");


参考技术D 不用递归也可以,就是麻烦点

递归函数的写法笔记

脑袋总是记不住,做个笔记记下方便用时查询。

 

情景一:Java电商项目中的商品品类管理。品类呈树形结构,现要求找到某一节点下的所有子节点。

// 递归算法,找到子节点
private Set<Category> findChildCategory(Set<Category> categorySet, Integer categoryId){
    // Mybatis的数据库查询方法
    Category category = categoryMapper.selectByPrimaryKey(categoryId);
    if (category != null){
        categorySet.add(category);
    }

    // 查找子节点,如果子节点为空就退出递归。递归算法一定要有一个退出的条件
    List<Category> categoryList = categoryMapper.selectCategoryChildrenByParentId(categoryId);
    for (Category categoryItem : categoryList){
        findChildCategory(categorySet, categoryItem.getId());
    }

    return categorySet;
}

这里为了防止品类重复使用了Set集合。使用该集合要求实体类Category重写equals()和hashCode()方法。

 

情景二:WPF中UI呈树形结构,想要查找指定控件下的所有子控件。

public static List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
{
    DependencyObject child = null;
    List<T> childList = new List<T>();

    for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
    {
        child = VisualTreeHelper.GetChild(obj, i);

        if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
        {
            childList.Add((T)child);
        }

        childList.AddRange(GetChildObjects<T>(child, ""));
    }

    return childList;
}

 

观察函数的规律:

  • 返回值和传参是相同的集合列表。
  • 传参一个变量用来筛选符合条件的子节点。

以上是关于java 找到一节点的所有子节点 是否得递归实现?的主要内容,如果未能解决你的问题,请参考以下文章

JS根据子节点递归获取所有父节点的集合

SQL递归查询所有子节点

200分求助!SQL递归查询所有子节点

Delphi TreeView 选择父节点,选择所有子节点

oracle 递归 通过子节点查询根节点

Java 求解二叉树的所有路径