刷题笔记day14-二叉树01

前序遍历

前序遍历的方式是:根节点、左节点、右节点。

前序遍历

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

func preorderTraversal(root *TreeNode) []int {
    // 思路1:使用递归的方法。三要素:返回条件和参数,单层的逻辑。
    // 思路2:层次遍历:使用栈。根左右
    result := []int{}
    if root == nil {
        return result
    }
    stack := list.New()
    stack.PushBack(root)
    for stack.Len() != 0 {
        top := stack.Remove(stack.Back())
        node := top.(*TreeNode)
        result = append(result, node.Val)
        
        if node.Right != nil {
            stack.PushBack(node.Right)
        }
        if node.Left != nil {
            stack.PushBack(node.Left)
        }
    }
    return result
}

中序遍历

中序遍历的思路是,左节点、根节点、右节点。
中序遍历


/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
import "container/list"
func inorderTraversal(root *TreeNode) []int {
    // 思路1:中序遍历,左、根、右。使用栈
    result := []int{}
    stack := list.New()
    curr := root
    for curr != nil || stack.Len() > 0 {
        // 左左入栈
        if curr != nil {
            stack.PushBack(curr)
            curr = curr.Left
            continue
        } 
        top := stack.Remove(stack.Back())
        node := top.(*TreeNode)
        // 左中节点存入结果
        result = append(result, node.Val)
        // 访问右子树
        if node.Right != nil {
            curr = node.Right
        }
    }
    return result
}

后序遍历

前序遍历是:根左右,翻转就是右左根。如果是根右左,翻转就是左右根了

后序遍历

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
import (
    "container/list"
)

func postorderTraversal(root *TreeNode) []int {
    // 思路:后序遍历:左、右、根
    // 前序遍历是:根左右,翻转就是右左根。如果是根右左,翻转就是左右根了
    result := []int{}
    if root == nil {
        return result
    }
    stack := list.New()
    stack.PushBack(root)
    for stack.Len() > 0 {
        top := stack.Remove(stack.Back())
        node := top.(*TreeNode)
        result = append(result, node.Val)
        if node.Left != nil {
            stack.PushBack(node.Left)
        }
        if node.Right != nil {
            stack.PushBack(node.Right)
        }
    }
    // 倒序排序
    newResult := []int{}
    for i := len(result) - 1; i >= 0; i-- {
        newResult = append(newResult, result[i])
    }
    return newResult

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值