二叉树的层次遍历(BFS和DFS)

 

leetcode 102题 :https://leetcode-cn.com/problems/binary-tree-level-order-traversal/

 

# 广度优先搜索(BFS)

自己的解法

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

func levelOrder(root *TreeNode) [][]int {
    var ret [][]int
    if root == nil {
        return ret
    }
    // 使用两个队列,队列1保存本层节点,队列2保存下一层节点
    queue := []*TreeNode{root}
    nQueue := []*TreeNode{}
    
    level := []int{}
    for len(queue)!=0{
        // 出队
        node := queue[0]
        queue = queue[1:]
        level = append(level,node.Val)
        
        // 子节点入队
        if node.Left!=nil{
            nQueue = append(nQueue,node.Left)
        }
        if node.Right!=nil{
            nQueue = append(nQueue,node.Right)
        }
        
        // 本层节点遍历完,继续遍历下一层
        if len(queue) == 0 {
            ret = append(ret,level)
            level = []int{}
            queue = nQueue
            nQueue = []*TreeNode{}
        }
    } 
    return ret
}

看了一下别人的题解,发现只需使用一个队列即可,代码也比较简洁

func levelOrder(root *TreeNode) [][]int {
    var ret [][]int
    if root == nil {
        return ret
    }
    queue := []*TreeNode{root}
    for len(queue)!=0{
        n := len(queue)
        level := make([]int,n)
        // 只遍历n次
        for i:=0 ;i <n; i++ {
            // 出队
            node := queue[0]
            queue = queue[1:]
            level[i] = node.Val
            // 子节点只入队,不会被遍历到
            if node.Left!=nil{
                queue = append(queue,node.Left)
            }
            if node.Right!=nil{
                queue = append(queue,node.Right)
            }
        }
        ret = append(ret,level)
        // 循环下一层
    } 
    return ret
}

# 深度优先搜索(DFS)

覃超老师的课中还提到了深度优先遍历的写法(先序遍历,递归,感觉go里面带切片参数的递归写起来不够优雅啊~)

func levelOrder(root *TreeNode) [][]int {
    ret := [][]int{}
    if root == nil {
        return nil
    }
    ret = preOrder(root,0,ret)
    return ret
}

func preOrder(root *TreeNode,h int, ret [][]int) [][]int {
    if root == nil {
        return ret
    }
    if len(ret) == h {
        ret = append(ret, []int{})
    }
    ret[h] = append(ret[h], root.Val)
    ret = preOrder(root.Left,h+1,ret)
    ret = preOrder(root.Right,h+1,ret)
    return ret
}

自己又尝试写DFS的非递归写法,但是发现比较麻烦,主要是节点属于哪一层需要额外记录。

反过头来思考递归写法,节点的层数已经在调用栈中记录了。

如果你有DFS比较好的非递归写法,麻烦写在评论中,谢谢~

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值