前序遍历:
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root) {
TreeNode *p=root;
TreeNode *top;
vector<int> result;
stack<TreeNode*>st;
if(root==NULL) return result;
//访问指针p和栈均为空则已经遍历结束。
while(p||!st.empty()){
if(p)
{
//输出当前节点
result.push_back(p->val);
st.push(p);
p=p->left;
}
else{
p=st.top();
st.pop();
p=p->right;
}
}
return result;
}
};
中序遍历(更换一排代码)ss
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
TreeNode *p=root;
TreeNode *top;
vector<int> result;
stack<TreeNode*>st;
if(root==NULL) return result;
//访问指针p和栈均为空则已经遍历结束。
while(p||!st.empty()){
if(p)
{
//输入当前节点
st.push(p);
p=p->left;
}
else{
p=st.top();
st.pop();
result.push_back(p->val);
p=p->right;
}
}
return result;
}
};
后序遍历(需要增加访问节点存储访问纪录,因为top节点不会立马出栈)
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
if(root==NULL) return result;
TreeNode *p=root,*r;
stack<TreeNode*>st;
while(p||!st.empty()){
if(p){
st.push(p);
p=p->left;
}
else{
p=st.top();
//增加控制节点r,右孩子存在且未被访问过
if(p->right&&p->right!=r) p=p->right;
else{
st.pop();
result.push_back(p->val);
r=p;
p=NULL;
}
}
}
return result;
}
};
二叉树非递归遍历,菜bird考研记录
于 2023-08-20 15:17:02 首次发布