leetcode 144.二叉树的前序遍历
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode() : val(0), left(nullptr), right(nullptr) {}
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
TreeNode(int x, TreeNode *left, TreeNode *right) : val(x),left(left), right(right) {}
};
递归三部曲
参数和返回值:输入根节点,输出遍历结果vector
递归的单层逻辑:将当前节点添加到结果集,遍历其左右子树
递归函数的终止条件:当前节点为空则返回
class Solution {
vector<int> result; //定义全局变量保存每次遍历的结果,不能再递归函数中定义,递归函数是局部变量,递归返回时局部变量消亡了
public:
vector<int> preorderTraversal(TreeNode* root) {
if(root == nullptr)
return result;
result.push_back(root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
return result;
}
};
迭代解法
当前节点不为空,则将其添加到结果集,当前节点入栈,当前节点更新为其左孩子,直到左孩子为空时,当前节点更新为其右孩子,栈顶元素出栈,直到栈为空且当前节点为空退出循环
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> nodeStack;
while(root != nullptr || !nodeStack.empty()){
if(root != nullptr) //当前节点不为空则入栈,当前节点等于它的左孩子
{
result.push_back(root->val);
nodeStack.push(root);
root = root->left;
continue;
}
//当前节点为空,则移除栈顶元素,栈顶元素的右子树进栈
root = nodeStack.top()->right;
nodeStack.pop();
}
return result;
}