代码随想录 day13二叉树

day 13第六章二叉树

今日内容: 

● 理论基础

● 递归遍历

前序遍历:

 

func preorderTraversal(root *TreeNode) (res []int) {

    var traversal func(node *TreeNode)

    traversal = func(node *TreeNode) {

 if node == nil {

            return

 }

 res = append(res,node.Val)

 traversal(node.Left)

 traversal(node.Right)

    }

    traversal(root)

    return res

}

 

中序遍历:

 

func inorderTraversal(root *TreeNode) (res []int) {

    var traversal func(node *TreeNode)

    traversal = func(node *TreeNode) {

 if node == nil {

     return

 }

 traversal(node.Left)

 res = append(res,node.Val)

 traversal(node.Right)

    }

    traversal(root)

    return res

}

后序遍历:

 

func postorderTraversal(root *TreeNode) (res []int) {

    var traversal func(node *TreeNode)

    traversal = func(node *TreeNode) {

 if node == nil {

     return

 }

 traversal(node.Left)

 traversal(node.Right)

        res = append(res,node.Val)

    }

    traversal(root)

    return res

}

 

● 迭代遍历

func preorderTraversal(root *TreeNode) []int {

    ans := []int{}

 

 if root == nil {

  return ans

 }

 

 st := list.New()

    st.PushBack(root)

 

    for st.Len() > 0 {

        node := st.Remove(st.Back()).(*TreeNode)

 

        ans = append(ans, node.Val)

        if node.Right != nil {

            st.PushBack(node.Right)

        }

        if node.Left != nil {

            st.PushBack(node.Left)

        }

    }

    return ans

}

 

● 统一迭代

       return nil

    }

    stack:=list.New()//栈

    res:=[]int{}//结果集

    stack.PushBack(root)

    var node *TreeNode

    for stack.Len()>0{

        e := stack.Back()

        stack.Remove(e)

        if e.Value==nil{// 如果为空,则表明是需要处理中间节点

            e=stack.Back()//弹出元素(即中间节点)

            stack.Remove(e)//删除中间节点

            node=e.Value.(*TreeNode)

            res=append(res,node.Val)//将中间节点加入到结果集中

            continue//继续弹出栈中下一个节点

        }

        node = e.Value.(*TreeNode)

        //压栈顺序:右中左

        if node.Right!=nil{

            stack.PushBack(node.Right)

        }

        stack.PushBack(node)//中间节点压栈后再压入nil作为中间节点的标志符

        stack.PushBack(nil)

        if node.Left!=nil{

            stack.PushBack(node.Left)

        }

    }

    return res

}

后序遍历统一迭代法

 

//后续遍历:左右中

//压栈顺序:中右左

func postorderTraversal(root *TreeNode) []int {

 if root == nil {

  return nil

 }

 var stack = list.New()//栈

    res:=[]int{}//结果集

    stack.PushBack(root)

    var node *TreeNode

    for stack.Len()>0{

        e := stack.Back()

        stack.Remove(e)

        if e.Value==nil{// 如果为空,则表明是需要处理中间节点

            e=stack.Back()//弹出元素(即中间节点)

            stack.Remove(e)//删除中间节点

            node=e.Value.(*TreeNode)

            res=append(res,node.Val)//将中间节点加入到结果集中

            continue//继续弹出栈中下一个节点

        }

        node = e.Value.(*TreeNode)

        //压栈顺序:中右左

        stack.PushBack(node)//中间节点压栈后再压入nil作为中间节点的标志符

        stack.PushBack(nil)

        if node.Right!=nil{

            stack.PushBack(node.Right)

        }

        if node.Left!=nil{

            stack.PushBack(node.Left)

        }

    }

    return res

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值