LeetCode11_二叉树的层序遍历_BFS迭代、DFS递归、拓展BFS的使用场景

一、题目描述


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

在这里插入图片描述
另 后面出现的要求最后返回从底 到顶的 结果形式

在这里插入图片描述

二、题解


2.1BFS迭代、

和以往简单的BFS不同,这里要求返回结果的格式,需要处理一下

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public List<List<Integer>> levelOrder(TreeNode root) {
    
    
        List<List<Integer>> res = new ArrayList<>();
        if(root == null){
    
    
            return res;
        }
        Queue<TreeNode> mq = new LinkedList<>();
        mq.offer(root);
        while(!mq.isEmpty()){
    
    
            List<Integer> ml = new ArrayList<>();
            int len = mq.size();
            for(int i = 1;i<=len;i++){
    
    
                TreeNode node = mq.poll();
                ml.add(node.val);

                if(node.left != null){
    
    
                    mq.offer(node.left);
                }

                if(node.right != null){
    
    
                    mq.offer(node.right);
                }


            }
            res.add(ml);
        }
        return res;


    }
}

对于返回结果的要求,只需要处理将 子list 每次插入到 父list 的 0 位置 即可

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    
    
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
    
    

        List<List<Integer>> res = new ArrayList<>();
       
        Queue<TreeNode> mq = new LinkedList<>();
        if(root == null){
    
    
            return res;
        }
        mq.offer(root);

        while(!mq.isEmpty()){
    
    
            
            List<Integer> ml = new ArrayList<>();
            int len = mq.size();

            for(int i = 1;i<=len;i++){
    
    
                TreeNode node = mq.poll();
                ml.add(node.val);
                if(node.left != null){
    
    
                    mq.offer(node.left);
                }
                if(node.right != null){
    
    
                    mq.offer(node.right);
                }
            }
            //这里处理一下要求返回的格式,每次将子List插到 0 位置
            res.add(0,ml);

        }
        return res;
        
        


    }
}

再贴一下C++的代码

class Solution {
    
    
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
    
    
        auto levelOrder = vector<vector<int>>();
        if (!root) {
    
    
            return levelOrder;
        }
        queue<TreeNode*> q;
        q.push(root);
        while (!q.empty()) {
    
    
            auto level = vector<int>();
            int size = q.size();
            for (int i = 0; i < size; ++i) {
    
    
                auto node = q.front();
                q.pop();
                level.push_back(node->val);
                if (node->left) {
    
    
                    q.push(node->left);
                }
                if (node->right) {
    
    
                    q.push(node->right);
                }
            }
            levelOrder.push_back(level);
        }
        reverse(levelOrder.begin(), levelOrder.end());
        return levelOrder;
    }
};


2.2BFS的使用场景

  • BFS模板
void bfs(TreeNode root) {
    
    
    Queue<TreeNode> queue = new ArrayDeque<>();
    queue.add(root);
    while (!queue.isEmpty()) {
    
    
        TreeNode node = queue.poll(); // Java 的 pop 写作 poll()
        if (node.left != null) {
    
    
            queue.add(node.left);
        }
        if (node.right != null) {
    
    
            queue.add(node.right);
        }
    }
}

BFS使用场景:

  • 层序遍历
  • 最短路径

在这里插入图片描述

更多参考:LeetCode题解-BFS的使用场景总结

2.3DFS迭代实现层序遍历

  • DFS模板
void dfs(TreeNode root) {
    
    
    if (root == null) {
    
    
        return;
    }
    dfs(root.left);
    dfs(root.right);
}

DFS同样可以实现层序遍历

在这里插入图片描述

每次递归的时候都需要带一个 index(表示当前的层数),也就对应那个田字格子中的第几行,如果当前行对应的 list 不存在,就加入一个空 list 进去。

动态演示如下:
在这里插入图片描述

参考:LeetCode题解-迭代+递归 多图演示

import java.util.*;	
class Solution {
    
    
	public List<List<Integer>> levelOrder(TreeNode root) {
    
    
		if(root==null) {
    
    
			return new ArrayList<List<Integer>>();
		}
		//用来存放最终结果
		List<List<Integer>> res = new ArrayList<List<Integer>>();
		dfs(1,root,res);
		return res;
	}
	
	void dfs(int index,TreeNode root, List<List<Integer>> res) {
    
    
		//假设res是[ [1],[2,3] ], index是3,就再插入一个空list放到res中
		if(res.size()<index) {
    
    
			res.add(new ArrayList<Integer>());
		}
		//将当前节点的值加入到res中,index代表当前层,假设index是3,节点值是99
		//res是[ [1],[2,3] [4] ],加入后res就变为 [ [1],[2,3] [4,99] ]
		res.get(index-1).add(root.val);
		//递归的处理左子树,右子树,同时将层数index+1
		if(root.left!=null) {
    
    
			dfs(index+1, root.left, res);
		}
		if(root.right!=null) {
    
    
			dfs(index+1, root.right, res);
		}
	}
}


猜你喜欢

转载自blog.csdn.net/qq_24654501/article/details/111187322