題目來源於 LeetCode 上第 144號(Binary Tree Preorder Traversal)問題:二叉樹的前序遍歷。題目難度為 Medium。
題目地址: https://leetcode.com/problems/binary-tree-preorder-traversal/
題目描述
Given a binary tree, return the preorder traversal of its nodes' values.
給定一個二叉樹,返回其節點值的前序遍歷
Input: [1,null,2,3]
1
\
2
/
3
Output: [1,2,3]
複製程式碼
二叉樹的前序遍歷過程: 根節點 -> 左子樹 -> 右子樹,如下圖所示:
結果為: 4 2 1 3 6 5 7
題目解析
- 迴圈檢測棧是否為空,或者根節點是否為空
- 迴圈檢測左節點,儲存到棧中
- 當左節點遍歷結束之後,取出棧頂的右節點,再次執行步驟2
程式碼實現一(非遞迴)
class Solution {
/**
* 前序遍歷
* @param root 根節點
* @return 前序遍歷的集合
*/
public List<Integer> preorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack();
List<Integer> list = new LinkedList();
/**
* 步驟1
* 迴圈檢測棧是否為空,或者根節點是否為空
*/
while(!stack.isEmpty() || root!=null){
/**
* 步驟2
* 迴圈檢測左節點,儲存到棧中
*/
while(root!=null){
stack.push(root);
list.add(root.val);
root = root.left;
}
/**
* 步驟3
* 取出棧頂的右節點,再次執行步驟2
*/
if(!stack.isEmpty()){
root = stack.pop().right;
}
}
return list;
}
}
複製程式碼
程式碼實現二(遞迴)
class Solution {
List<Integer> list = new LinkedList();
public List<Integer> preorderTraversal(TreeNode root) {
if (root == null) return list;
list.add(root.val);
preorderTraversal(root.left);
preorderTraversal(root.right);
return list;
}
}
複製程式碼