《leetcode-go》二叉树遍历

前序、中序、后序遍历

package main
import . "nc_tools"
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
  * 
  * @param root TreeNode类 
  * @return int整型一维数组
*/
type Stack struct {
	Val []*TreeNode
	i   int
}

func (stack *Stack) Push(node *TreeNode) {
	stack.Val = append(stack.Val, node)
	stack.i++
}

func (stack *Stack) Pop() (node *TreeNode) {
	node = stack.Val[stack.i-1]
	stack.Val = stack.Val[0 : stack.i-1]
	stack.i--
	return
}
func postorderTraversal( root *TreeNode ) []int {
    // write code here
    var retList []int
	if root == nil {
		return retList
	}
	var pre *TreeNode
	stack := new(Stack)
	stack.Push(root)
	for len(stack.Val) > 0 {
		node := stack.Val[stack.i-1]
		if (pre != nil && (pre == node.Left || pre == node.Right)) || (node.Left == nil && node.Right == nil) {
			//fmt.Println(node.Val)
			retList = append(retList, node.Val)
			stack.Pop()
			pre = node
			continue
		}
		if node.Right != nil {
			stack.Push(node.Right)
		}
		if node.Left != nil {
			stack.Push(node.Left)
		}
	}
	return retList
}

func preorderTraversal( root *TreeNode ) []int {
    // write code here
    var retList []int
	if root == nil {
		return retList
	}
	stack := new(Stack)
	stack.Push(root)
	for len(stack.Val) > 0 {
		node := stack.Pop()
		//fmt.Println(node.Val)
		retList = append(retList, node.Val)
		if node.Right != nil {
			stack.Push(node.Right)
		}
		if node.Left != nil {
			stack.Push(node.Left)
		}
	}
	return retList
}

func inorderTraversal( root *TreeNode ) []int {
    // write code here
    var retList []int
	if root == nil {
		return retList
	}
	stack := new(Stack)
	stack.Push(root)
	node := root
	for len(stack.Val) > 0 {
		for node.Left != nil {
			stack.Push(node.Left)
			node = node.Left
		}
		for len(stack.Val) > 0 {
			node = stack.Pop()
			//fmt.Println(node.Val)
			retList = append(retList, node.Val)
			if node.Right != nil {
				stack.Push(node.Right)
				node = node.Right
				break
			}
		}
	}
	return retList
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值