对一棵树进行由下至上的操作

我这里遇到的问题是,我能获取到所有最末端叶子节点的count属性值。想要对整棵树的各个节点的count字段赋值,这个值就是每个子节点求和。思考了一天,最终用栈的特性解决了。在树的类里加了个visited属性进行辅助遍历。希望能帮助到大家。话不多说,直接上代码

package com.zdww.rocketmq.client.server.model;

import com.alibaba.fastjson.JSON;
import org.springframework.util.CollectionUtils;

import java.util.*;

/**
 * @Description TODO
 * @Author whl
 * @Date 2020/1/13 15:59
 **/
public class Test {

    public static void main(String[] args) {

        Tree build1 = Tree.builder().code(1).children(new ArrayList<>()).build();
        Tree build2 = Tree.builder().code(2).children(new ArrayList<>()).build();
        Tree build5 = Tree.builder().code(5).children(new ArrayList<>()).build();
        Tree build3 = Tree.builder().code(3).children(new ArrayList<>()).build();
        Tree build4 = Tree.builder().code(4).children(new ArrayList<>()).build();
        Tree build6 = Tree.builder().code(6).children(new ArrayList<>()).build();
        Tree build7 = Tree.builder().code(7).children(new ArrayList<>()).build();

        build5.getChildren().add(build7);
        build5.getChildren().add(build6);
        build2.getChildren().add(build4);
        build2.getChildren().add(build3);
        build1.getChildren().add(build2);
        build1.getChildren().add(build5);

        System.out.println("===========树组装完成==============");
        Map<Integer, Integer> map = new HashMap<>(4);
        map.put(3, 2);
        map.put(4, 3);
        map.put(6, 9);
        map.put(7, 7);
        System.out.println("===========为树的最末端节点准备count值==============");
        Stack<Tree> stack = new Stack<>();
        stack.push(build1);
        System.out.println("===========使用栈的特性对树由下至上的为每个节点的count赋值==============");
        while (!stack.isEmpty()) {
            Tree pop = stack.peek();
            if (CollectionUtils.isEmpty(pop.getChildren())) {
                pop.setCount(map.get(pop.getCode()));
            }
            if (!CollectionUtils.isEmpty(pop.getChildren()) && !pop.isVisited()) {
                pop.setVisited(true);
                stack.addAll(pop.getChildren());
            } else {
                stack.pop();
                if (!CollectionUtils.isEmpty(pop.getChildren())) {
                    pop.setCount(pop.getChildren().stream().mapToInt(Tree::getCount).sum());
                }
            }
        }

        System.out.println(JSON.toJSONString(build1));

    }

}

package com.zdww.rocketmq.client.server.model;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

/**
 * @Description TODO
 * @Author whl
 * @Date 2020/1/15 11:04
 **/

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Tree {

    //节点code
    private Integer code;
    //父节点
    private Integer pCode;
    //计数
    private Integer count;
    //访问过
    private boolean visited = false;

    private List<Tree> children;


}

随机森林(Random Forest)是一种集成学习方法,它由多个决策树组成,每个树的预测结果会通过投票或平均的方式综合得出最终的结果。在随机森林中,每一棵树都是独立训练的,并且在构建每棵树时,都使用了随机特征子集和随机样本子集,这有助于减少过拟合并提高模型的稳定性。 要实现随机森林中单棵决策树的可视化,首先你需要使用某种编程语言(如Python的scikit-learn库),它的`DecisionTreeClassifier`或`DecisionTreeRegressor`类可以用来生成决策树。然后,选择一棵树进行可视化通常涉及以下步骤: 1. **模型训练**: ```python from sklearn.ensemble import RandomForestClassifier/Regressor model = RandomForestClassifier(n_estimators=100) # 创建随机森林模型,假设100棵树 model.fit(X_train, y_train) # 在训练数据上训练模型 ``` 2. **获取单棵决策树**: ```python tree_index = 0 # 选择你想要可视化的树索引,从0开始 tree = model.estimators_[tree_index] # 获取第tree_index棵树 ``` 3. **使用可视化库**: 使用如`graphviz`(对Python)或`dot`(图形语法)进行可视化。这里是一个简单的示例,展示如何使用`sklearn.tree.export_graphviz`和`graphviz`: ```python import graphviz dot_data = tree.export_graphviz(tree, out_file=None, feature_names=X_train.columns, class_names=y_train.unique(), filled=True, rounded=True, special_characters=True) graph = graphviz.Source(dot_data) graph.render("tree_{}".format(tree_index)) # 生成并保存图片 ``` 4. **查看结果**: 可以打开生成的图片文件(比如"tree_0.dot")来查看决策树的结构。 相关问题: 1. 如何在Python中安装和使用graphviz库? 2. 随机森林中的树结构复杂度如何影响可视化效果? 3. 对于非常大的数据集,可视化单棵树是否可行?如果不是,有哪些替代方法来理解决策过程?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值