給你二叉樹的根節點 root ,返回它節點值的 前序
遍歷。node
示例 1:算法
輸入:root = [1,null,2,3] 輸出:[1,2,3]
示例 2:app
輸入:root = [] 輸出:[]
示例 3:函數
輸入:root = [1] 輸出:[1]
具體代碼以下:code
//Definition for a binary tree node. type TreeNode struct { Val int Left *TreeNode Right *TreeNode }
/*遞歸三部曲 1.肯定遞歸函數的參數和返回值 2.肯定終止條件 3.肯定單層遞歸的邏輯 */ //1.肯定遞歸函數的參數和返回值:由於要打印出前序遍歷節點的數值,因此參數裏傳入[]int類型 //不須要有返回值 func traversal(root *TreeNode, result *[]int) { //2.肯定終止條件 if root == nil { return } //3.肯定單層遞歸的邏輯 //前序遍歷 是中 左 右 的順序,因此先取中間節點的值 *result = append(*result, root.Val) //中 traversal(root.Left, result) //左子樹 traversal(root.Right, result) //右子樹 } func preorderTraversal(root *TreeNode) []int { result := make([]int, 0) traversal(root, &result) return result }
迭代算法blog
前序遍歷是中左右
,每次先處理的是中間節點,那麼先將跟節點放入棧中,而後將右孩子加入棧,再加入左孩子。爲何要先加入 右孩子,再加入左孩子呢?由於這樣出棧的時候纔是中左右的順序。遞歸
這裏引入了公衆號代碼隨想錄的圖,方便理解it
func preorderTraversal(root *TreeNode) []int { stack := make([]*TreeNode, 0) //存放二叉樹節點 result := make([]int, 0) //存放節點數值 stack = append(stack, root) //首先將根節點入棧 for len(stack) != 0 { cur := stack[len(stack)-1] stack = stack[:len(stack)-1] if cur != nil { result = append(result, cur.Val) //中 } else { continue //排除葉子節點所指向的左右孩子爲空 } stack = append(stack, cur.Right) //右子樹進棧 stack = append(stack, cur.Left) //左子樹進棧 } return result }