【二叉樹】leetcode144——二叉樹的前序遍歷

編號144:二叉樹的前序遍歷

給你二叉樹的根節點 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
}
相關文章
相關標籤/搜索