本文最后更新于:2022年9月6日 晚上
给你二叉树的根节点 root
,返回它节点值的 前序 遍历。
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
提示:
- 树中节点数目在范围
[0, 100]
内
-100 <= Node.val <= 100
进阶:递归算法很简单,你可以通过迭代算法完成吗?
Solution
参考 @z1m 、[94 二叉树的中序遍历] 、[145 二叉树的后序遍历]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
|
class Solution { public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; preorder(root, res); return res; } private: void preorder(TreeNode* root, vector<int>& res){ if(root){ res.push_back(root->val); preorder(root->left, res); preorder(root->right, res); } } };
|
- 迭代法
- 它先将根节点 node 和所有的左孩子入栈并加入结果中,直至 node 为空
- 然后,每弹出一个栈顶元素
tmp
,就到达它的右孩子,再将这个节点当作 node 重新按上面的步骤来一遍,直至栈为空。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> stack; vector<int> res; TreeNode* node = root; while(node!=nullptr || !stack.empty()){ while(node != nullptr){ res.push_back(node->val); stack.push(node); node = node->left; } node = stack.top(); stack.pop(); node = node->right; } return res; } };
|
Java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<>(); preorder(root, result); return result; }
private void preorder(TreeNode root, List<Integer> rec) { if (root == null) { return; } rec.add(root.val); preorder(root.left, rec); preorder(root.right, rec); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> result = new ArrayList<>(); Deque<TreeNode> stack = new LinkedList<>(); TreeNode node = root; while (node != null || !stack.isEmpty()) { while (node != null) { result.add(node.val); stack.push(node); node = node.left; } node = stack.pop(); node = node.right; } return result; } }
|