java递归查找树是否存在某个节点

忘了在哪里看到的题目了,有这样一种树形结构(如下图),用递归的方法查找是否存在某个节点。

网上找了很久,都是遍历子节点的,都不是我想要的答案,于是自己手动写了,想知道各位大佬还有没有其他方法。

在这里插入图片描述

上代码:

package com.founder.ipc.reconciliation.controller;
import java.util.ArrayList;
import java.util.List;

/**
 * 递归查找是否存在某个树节点
 * @author
 * @date
 */
public class Test {

    public static void main(String[] args) {
        Test t = new Test();
        TreeNode root = t.treeInit();
        TreeNode tn = t.findById(root, "2-1");
        System.out.println(tn == null ? "未找到" : "找到了~~~");
    }

    /**
     * 递归查找某个节点
     **/
    private TreeNode findById(TreeNode treeNode, String id) {
        if (null == treeNode) {
            return null;
        } else {
            if (id.equals(treeNode.getId())) {
                return treeNode;
            } else {
                List<TreeNode> childList = treeNode.getChild();
                if (null != childList) {
                    for (TreeNode child : childList) {
                        TreeNode result = findById(child, id);
                        if (result != null) {
                            return result;
                        }
                    }
                }
                return null;
            }
        }
    }

    /**
     * 树的初始化
     **/
    private TreeNode treeInit() {
        TreeNode root = new TreeNode();
        root.setId("root");
        TreeNode child1 = new TreeNode();
        child1.setId("1");
        TreeNode child2 = new TreeNode();
        child2.setId("2");
        TreeNode child1_1 = new TreeNode();
        child1_1.setId("1-1");
        TreeNode child1_2 = new TreeNode();
        child1_2.setId("1-2");
        TreeNode child1_3 = new TreeNode();
        child1_3.setId("1-3");
        List<TreeNode> childs1_list = new ArrayList<>();
        childs1_list.add(child1_1);
        childs1_list.add(child1_2);
        childs1_list.add(child1_3);
        TreeNode child2_1 = new TreeNode();
        child2_1.setId("2-1");
        List<TreeNode> childs2_list = new ArrayList<>();
        childs2_list.add(child2_1);
        child1.setChild(childs1_list);
        child2.setChild(childs2_list);
        List<TreeNode> childsR_list = new ArrayList<>();
        childsR_list.add(child1);
        childsR_list.add(child2);
        root.setChild(childsR_list);
        return root;
    }

    /**
     * 树节点的实体
     **/
    private class TreeNode {
        private String id;
        private List<TreeNode> child;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public List<TreeNode> getChild() {
            return child;
        }

        public void setChild(List<TreeNode> child) {
            this.child = child;
        }
    }

}

运行结果:

D:\MyJavaUtil\JDK8\bin\java.exe ...
找到了~~~

Process finished with exit code 0
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值