【代码随想录】Day14,15 二叉树

#二叉树的递归遍历

  1. 94.  二叉树的中序遍历
  2. 144. 二叉树的前序遍历
  3. 145. 二叉树的后序遍历

 二叉树的前序遍历:按照访问根节点——左子树——右子树的方式遍历这棵树

1.递归

func preorderTraversal(root *TreeNode) (res []int) {
   var preorder func(node *TreeNode)
   preorder = func(node *TreeNode){
       if node == nil {
           return
       }
       res = append(res,node.Val)
       preorder(node.Left)
       preorder(node.Right)
   }

   preorder(root)

    return res
}

2.迭代

func preorderTraversal(root *TreeNode) []int {
    stack := []*TreeNode{}
    vals := []int{}
    node := root
    for node != nil || len(stack) > 0{
        for node != nil {
            vals = append(vals,node.Val)
            stack = append(stack,node)
            node=node.Left
        }
        node=stack[len(stack)-1].Right
        stack=stack[:len(stack)-1]
    }
    return vals
}

 二叉树的中序遍历:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。

func inorderTraversal(root *TreeNode) (res []int) {
    var inorder func(node *TreeNode)
    inorder = func(node *TreeNode){
        if node == nil {
            return
        }
        inorder(node.Left)
        res = append(res,node.Val)
        inorder(node.Right)
    }

    inorder(root)
    return
}

 迭代

func inorderTraversal(root *TreeNode) []int {

    vals := []int{}
    stacks := []*TreeNode{}
    if root == nil {
        return vals
    }
    node := root
    for node != nil || len(stacks) > 0 {
        for node != nil {
            stacks = append(stacks,node)
            node = node.Left
        }
        node=stacks[len(stacks)-1]
        stacks = stacks[:len(stacks)-1]
        vals = append(vals,node.Val)
        node=node.Right
    }
    return vals

}

二叉树的后序遍历:按照访问左子树——右子树——根节点的方式遍历这棵树,而在访问左子树或者右子树的时候,我们按照同样的方式遍历,直到遍历完整棵树。

func postorderTraversal(root *TreeNode) (res []int) {
    var postorder func(node *TreeNode)
    postorder = func(node *TreeNode) {
        if node == nil {
            return
        }
        postorder(node.Left)
        postorder(node.Right)
        res = append(res,node.Val)
    }

    postorder(root)

    return

}

迭代

func postorderTraversal(root *TreeNode) []int {
    vals := []int{}
    if root == nil {
        return vals
    }
    stack := []*TreeNode{}
    var prev *TreeNode
    node := root
    for node != nil || len(stack) > 0 {
        for node != nil {
            stack = append(stack,node)
            node = node.Left
        }
        node = stack[len(stack)-1]
        stack = stack[:len(stack)-1]
        if node.Right == nil || node.Right == prev  {
            vals = append(vals,node.Val)
            prev = node
            node = nil
        } else {
            stack = append(stack,node)
            node = node.Right
        }   
    }
    return vals
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值