zoukankan      html  css  js  c++  java
  • 0107-二叉树的层序遍历II-

    给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

    例如:
    给定二叉树 [3,9,20,null,null,15,7],

    3
    

    /
    9 20
    /
    15 7
    返回其自底向上的层序遍历为:

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

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/binary-tree-level-order-traversal-ii

    层序遍历的基础上,返回结果前将其反转即可

    python

    # 0107.二叉树的层序遍历II
    class Solution:
        def levelOrder(self, root: TreeNode) -> [[int]]:
            """
            迭代法:双端队列,每次把单层的节点遍历出队列,另外将对应的左右节点加入队列
            :param root:
            :return:
            """
            results = []
            if not root:
                return results
    
            from collections import deque
            queue = deque([root]) # 初始化队列
    
            while queue:
                size = len(queue) # 遍历队列单层长度
                res = [] # 每次遍历时初始化加入结果集中的列表
                for _ in range(size):
                    cur = queue.popleft() # 通过size控制遍历次数
                    res.append(cur.val) # 加入结果集中
                    if cur.left: # 添加当前pop节点的左节点进入队列
                        queue.append(cur.left)
                    if cur.right: # 添加当前pop节点的右节点进入队列
                        queue.append(cur.right)
                results.append(res) # 当层中的所有节点的值放入list中
            results.reverse()
            return results
    
        def levelOrderRecur(self, root: TreeNode) -> [[int]]:
            """
            递归法,
            :param root:
            :return:
            """
            res = []
            def levelOrder(node, index):
                if not node: # 空,返空
                    return []
                if len(res) < index: # 开始当前depth
                    res.append([])
                res[index-1].append(node.val) # 当前层加入节点值到结果集
                if node.left: # 当前节点有左节点,继续递归,同时层数加1
                    levelOrder(node.left, index+1)
                if node.right: # 当前节点有右节点,继续递归,同时层数加1
                    levelOrder(node.right, index+1)
            levelOrder(root, 1) # 1层开始递归
            res.reverse()
            return res
    
    

    golang

    package binaryTree
    
    import "container/list"
    
    // 递归遍历
    func levelOrderRecurII(root *TreeNode) [][]int {
    	var levelOrder func(node *TreeNode, depth int)
    	var res [][]int
    	levelOrder = func(node *TreeNode, depth int) {
    		if node == nil {
    			return
    		}
    		if len(res) == depth {
    			res = append(res, []int{})
    		}
    		res[depth] = append(res[depth], node.Val)
    		if node.Left != nil {
    			levelOrder(node.Left, depth+1)
    		}
    		if node.Right != nil {
    			levelOrder(node.Right, depth+1)
    		}
    	}
    	levelOrder(root, 0)
    	for i:=0;i<len(res)/2;i++ {
    		res[i], res[len(res)-i-1] = res[len(res)-i-1], res[i]
    	}
    	return res
    }
    
    // 迭代遍历
    func levelOrderiterationII(root *TreeNode) [][]int {
    	var res =  [][]int{}
    	if root == nil { // 空时返回
    		return res
    	}
    	queue := list.New() // 队列初始化
    	queue.PushBack(root)
    	var tmpArr []int
    	for queue.Len() > 0 {
    		length := queue.Len()
    		for i:=0;i<length;i++ { // 遍历当层的节点
    			node := queue.Remove(queue.Front()).(*TreeNode) // 当次节点
    			if node.Left != nil { // 节点的左节点入队
    				queue.PushBack(node.Left)
    			}
    			if node.Right != nil { // 节点的右节点入队
    				queue.PushBack(node.Right)
    			}
    			tmpArr = append(tmpArr, node.Val) // 节点值加入结果集
    		}
    		res = append(res, tmpArr)
    		tmpArr = []int{}
    	}
    	for i:=0;i<len(res)/2;i++ {
    		res[i], res[len(res)-i-1] = res[len(res)-i-1], res[i]
    	}
    	return res
    }
    
    
  • 相关阅读:
    Libev源码分析01:Libev中的监视器结构(C结构体实现继承)
    字符串处理函数
    sqrt函数实现
    Text Justification
    Minimum Path Sum
    Linux下如何查看系统启动时间和运行时间
    通过GDB重新获得进程的输出
    linux时间
    jmeter java请求:java.lang.VerifyError: Cannot inherit from final class
    面试——请带简历
  • 原文地址:https://www.cnblogs.com/davis12/p/15549806.html
Copyright © 2011-2022 走看看