LeetCode 144.二叉树的前序遍历
二叉树的前序非递归遍历,利用栈
- NLNLNLNLN……RLRLRLRL……R……
访问根,访问根的左结点(又作为一个新的根),访问新的根的左结点……返回……访问根的右结点(右结点作为新根),访问新根的左结点……访问右结点…… - 根入栈、访问、向左遍历(每个左结点将再次作为相对根节点)直到空,此时栈顶为叶结点,此时最末端的NL完成,取出栈顶的L,若这个L也为叶结点,继续取出栈顶的(相对)N,p指向它的R,入栈、访问……
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
TreeNode *p = root;
while(p || !st.empty()){
if(p){
st.push(p);
result.push_back(p->val);
p = p->left;
}else{
p = st.top();
st.pop();
p = p->right;
}
}
return result;
}
};