leetcode 429 BFS与层次遍历 小结

leetcode 429: 树的层次遍历

理解算法原理和上手操作是两回事啊,做到树的层次遍历的题目有关BFS的知识和模板用自己的语言总结一下。做的题目还不够多,欢迎大佬们的建议和讨论~

BFS:广度优先搜索(Breadth First Search)

从一个可能的节点出发,搜索每个与其直接相连的节点,以同样的方式对相连的节点进行迭代从而遍历所有节点。
数据结构:队列

DFS:深度优先搜索(Depth First Search)

从一个可能的节点出发,沿着其中一条相邻的边直到无路可走,以同样的方式迭代每一条相邻的边从而遍历所有节点。
数据结构:

BFS java 自我总结套路

只是现阶段自己总结的套路,具体问题还要具体分析。

//1. 建立队列并将起始节点放入队列中
Queue<Class> q = new LinkedList<>();
q.offer(first_node);
//2. BFS
while(!q.isEmpty()) { //*
	Node curr = q.poll(); //*
	process(curr);// 对curr做题目要求的事
	if (adjacent_list != null) { //curr有相邻的节点时
		for (Node node: adjacent_list) { // 在所有相邻节点(adjacent_list)中搜索
			q.offer(node); //*
		}
	}
}
leetcode 429 (self-report题解)

3 ms 42.1 MB

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> result = new ArrayList<>(); //result
        if (root != null) {
            Queue<List<Node>> q = new LinkedList<>(); //*
            List<Node> root_list = new ArrayList<Node>();
            root_list.add(root);
            q.offer(root_list);
            while (!q.isEmpty()) { //*
                // iteration
                List<Node> curr_layer = q.poll(); //*
                List<Node> next_layer = new ArrayList<Node>();

                // process
                List<Integer> layer = new ArrayList<Integer>();
                
                for (Node node: curr_layer) {
                    // process
                    layer.add(node.val); 

                    // iteration
                    if (node.children != null) {
                        for (Node child: node.children) {
                            next_layer.add(child);
                        }
                    }
                }
                // process
                if (layer.size() > 0) {
                    result.add(layer);
                }
                
                // 因为需要体现出层次遍历,所以在之前总结的基础上还要实现分层,即在循环外将整个一层加入队列。
                if (next_layer.size() > 0) {
                    q.offer(next_layer); //*
                }
            }
        }
        return result; //result
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值