一、题目描述:
给你二叉树的根节点
root
,返回它节点值的 前序 遍历。
二、输入输出实例:
示例 1:
输入:root = [1,null,2,3] 输出:[1,2,3]示例 2:
输入:root = [] 输出:[]示例 3:
输入:root = [1] 输出:[1]示例 4:
输入:root = [1,2] 输出:[1,2]示例 5:
输入:root = [1,null,2] 输出:[1,2]提示:
- 树中节点数目在范围
[0, 100]
内-100 <= Node.val <= 100
三、先决知识点:
- 无
四、思路讲解:
4.1递归思路:
- 先判断当前节点是否为空。
- 如果为空,直接返回。
- 如果不为空,将节点值存储到vector中,递归当前节点的左子树和右子树。
4.2循环思路:
- 创建一个vector对象,用于返回。然后判断根节点是否存在,如果不存在直接返回vector对象。
- 主要思想是利用栈,将每个节点分为左边和右边处理。
- 先处理左边,从根节点开始,一直向下找最左节点。期间将所有左节点的指针压栈,将节点值存储到vector中。先忽略所有路径上的右节点。
- 找到最左节点后,开始出栈每一个左节点,处理左节点的右子树,期间将每一个右子树看作左节点来继续压栈。
- 如果右节点为空,说明当前左节点已经全部处理完成。出栈下一个左节点,循环即可。
- 最后,当栈的最后一个左节点被弹出,整个二叉树就被处理为了。
五、C++代码:
5.1递归实现:
vector<int> preorderTraversal(TreeNode* root) { vector<int> v; preorder(root,v); return v; } void preorder(TreeNode* root,vector<int>& v) { if(root==nullptr) return; v.push_back(root->val); preorder(root->left,v); preorder(root->right,v); }
5.2循环实现:
vector<int> preorderTraversal(TreeNode* root) { vector<int> v; if(root==nullptr) return v; stack<TreeNode*> s; while(!s.empty()||root!=nullptr) { while(root!=nullptr) { v.push_back(root->val); s.push(root); root=root->left; } root=s.top(); s.pop(); root=root->right; } return v; }