看了王卓老师的数据结构与算法,收获挺多的!
递归(使用了系统栈):
void traverse(TreeNode* root,vector<int>& traArr){
if(root!=NULL){
traArr.push_back(root->val);
traverse(root->left,traArr);
traverse(root->right,traArr);
}
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> traArr;
traverse(root,traArr);
return traArr;
}
非递归(使用了用户栈):
vector<int> preorderTraversal(TreeNode* root) {
vector<int> traArr;
stack<TreeNode> nodeStk; //用户栈,栈顶为当前根结点元素
TreeNode* p=root; //p指针,指向当前根结点
TreeNode* q=NULL; //q指针,指向栈顶元素
while(p || !nodeStk.empty()){
if(p!=NULL){ //p指针非空,则其指向的结点压栈,再令p指针指向其左子树
traArr.push_back(p->val); //前序遍历,先访问根结点,再看左右子树
nodeStk.push(*p);
q=p; //q指针指向栈顶元素
p=p->left;
}else{ //p指针为空,则p指针指向栈顶元素的右子树,栈顶元素也弹出
p=q->right;
nodeStk.pop();
if(!nodeStk.empty()){ //q指向新的栈顶元素,否则指向空
q=&nodeStk.top();
}else{
q=NULL;
}
}
}
return traArr;
}