解题思路:
这道题目的解题思路与中序遍历一模一样,区别只在于输出结果放在push进栈之前。
程序的大循环是遍历整个树,所以循环停止条件是:栈为空,且当前访问节点root为NULL,这时说明所有的跟节点都访问过了,且最后一个右节点也访问过了。
大循环内,当存在左节点时,则一直向左探索,在将当前节点push进栈之前,需要先将当前节点的val存在结果中,这样才是前序遍历。
当root为NULL了,就将root置为栈顶的节点,并访问该节点的右子节点。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
if(root == NULL) return {};
vector<int> res;
stack<TreeNode*> s;
while(!s.empty() || root!=NULL){ //大循环,栈非空 或 当前节点非NULL
while(root != NULL){ //当左节点非NULL,一直向左子树探索
res.push_back(root->val);
s.push(root);
root = root->left;
}
root = s.top();
s.pop();
root = root->right;
}
return res;
}
};