wl413911

二叉树的层次遍历

链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其层次遍历结果:

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

思路1:广度优先搜索,从树的根节点开始,一层一层的遍历到叶子节点

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        if not root: # 边界条件,root为空,直接返回一个空列表
            return []

        result = [] # 存储每层节点的val值所组成的列表

        queue = collections.deque() # 建立一个队列
        queue.append(root)
    
     # visited = set(root) 这里遍历的是二叉树,不存在重复节点;如果遍历图,还需要维护一个已访问节点的集合,用来判重
        while queue: # 按层循环,每次循环取出所有元素,同时添加下一层的所有元素,直到最后一层,不再有新元素为止
 
            level_size = len(queue) # 每一层节点的个数
            cur_level_val = []  # 存储当前层节点的val值
            
            # 循环取出队列当前的所有元素(所有元素都在同一层内),将当前元素的val存进一个列表,将当前元素的子节点存入queue
            for i in range(level_size):
         # 循环取出当前层所有节点并处理
                node = queue.popleft()
                cur_level_val.append(node.val) # 将当前节点的值添加到 cur_level_val
         
         # 判断是否存在下一层节点,并存储到queue中
                if node.left:
                    queue.append(node.left) # 如果当前节点的左子节点存在,添加到队列中
                if node.right:
                    queue.append(node.right)# 如果当前节点的左子节点存在,添加到队列中
 
       #将当前层所有节点的val集合,存入result
            result.append(cur_level_val)

        return result
 
时间复杂度:O(n)
空间复杂度:O(n)
 
java版本
/**
 * 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;
        
        LinkedList<TreeNode> queue =  new LinkedList<>();
        queue.add(root);

        while(!queue.isEmpty()){

            int sizeOfLevel = queue.size();
            List<Integer> currentLevel = new ArrayList<>();
            
            for(int i = 0 ;i < sizeOfLevel;i++){
                TreeNode node = queue.poll();
                currentLevel.add(node.val);

                if(node.left != null)
                    queue.add(node.left);
                if(node.right != null)
                    queue.add(node.right);                 
            }
            res.add(currentLevel); 
        }
        return res;
    }
}
 
 

思路2:深度优先搜索——递归方案

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        if not root: # 边界判断
            return []
        self.result = [] # 存储最终结果
        self.process(root,0) # 实际的逻辑处理
        return self.result # 返回结果
 
    def process(self,node,level): # node 为当前节点 ,level为当前节点所处的层次
        # base case
        if not node:
            return
        # 判断result中是否已经存在存储当前层元素的列表,如果不存在,则添加一个空列表
        if len(self.result) < level+1# level是从0 开始的,所以需要加1
            self.result.append([]) 
 
        self.result[level].append(node.val) # 将当前节点数据,添加到存储当前level数据的列表中
 
        # 递归处理左右子节点
        self.process(node.left,level+1)
        self.process(node.right,level+1)


 

posted on 2020-05-23 12:53  wl413911  阅读(224)  评论(0编辑  收藏  举报