数据结构之广度优先搜索

这篇博客介绍了两种二叉树遍历方法:层次遍历和之字形层序遍历。层次遍历通过广度优先搜索(BFS)实现,先按层从左到右遍历,而之字形遍历则在每一层从左到右或从右到左交替进行。博主提供了具体的Java代码实现,分别展示了如何遍历二叉树并返回节点值的列表。这两种遍历方式对于理解和操作二叉树结构具有重要意义。
摘要由CSDN通过智能技术生成

广度优先搜索呈现出一层一层向外扩张的特点,先看到的结点先遍历,后看到的结点后遍历,因此广度优先搜索可以借助**队列**实现。当遍历到一个结点时,若这个结点有左(右)孩子结点,依次入队即可。结合队列实现思路如下图所示:
在这里插入图片描述

BFS模板代码

int BFS(Node root, Node target){
    Queue<Node> queue = new ArrayDeque<>();
    int step = 0;
    //添加根节点到队列
    queue.add(root);
    //BFS
    while(queue is not empty){
        step++;
        int size = queue.size();
        for(int i = 0; i < size; i++){
            //获取队头元素
            Node curr = this first node in queue;
            //若curr == target,返回step
            if(curr == target) return setp;
            for(Node next : the neighbors of curr){
                add next to queue;
            }
            remove the first node from queue;
        }
    }
    return -1;
}

如代码所示,在每一轮中,队列中的结点是等待处理的结点。在每个更外一层的 while 循环之后,我们距离根结点更远一步。变量 step 指示从根结点到我们正在访问的当前结点的距离。

二叉树的层序遍历

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

示例:

二叉树:[3,9,20,null,null,15,7]
在这里插入图片描述

输出结果:

[   
  [3],   
  [20,9],   
  [15,7]
] 

代码实现:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<>();
        Deque<TreeNode> deque = new ArrayDeque<>();
        if(root != null){
            deque.offer(root);
        }
        while(!deque.isEmpty()){
            //遍历的层数
            int n = deque.size();
            //保存每一层的节点值
            List<Integer> nodes = new ArrayList<>();
            for(int i = 0; i < n; i++){
                //出队
                TreeNode node = deque.poll();
                //添加元素
                nodes.add(node.val);
                // 若根节点的左节点不为空,入队
                if(node.left != null){
                    deque.offer(node.left);
                }
                // 若根节点的右节点不为空,入队
                if(node.right != null){
                    deque.offer(node.right);
                }
            }
            res.add(nodes);
        }
        return res;
    }
}

二叉树的Z字形层序遍历

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如: 给定的二叉树是{3,9,20,#,#,15,7},

在这里插入图片描述

输出结果:

[   
  [3],   
  [20,9],   
  [15,7]
] 

代码实现:

public class Solution {
    public ArrayList<ArrayList<Integer>> zigzagLevelOrder (TreeNode root) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<>();
        Queue<TreeNode> queue = new ArrayDeque<>();
        boolean isLeft = true;//true从左往右,false从右往左
        if(root != null){
            queue.offer(root);
        }
        while(!queue.isEmpty()){
            int n = queue.size();
            ArrayList<Integer> temp = new ArrayList<>();//保存每层的节点
            for(int i = 0; i < n; i++){
                TreeNode node = queue.poll();
                //判断是向左添加还是向右添加节点值
                if(isLeft){
                    temp.add(node.val);//尾部添加值
                }else{
                    temp.add(0, node.val);//向头部添加值
                }
                if(node.left != null){
                    queue.offer(node.left);
                }
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
            isLeft = !isLeft;
            res.add(temp);
        }
        return res;        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

所幸你是例外

你的鼓励将是我创作的最大动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值