树的结构
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
非递归先序遍历:
vector<int> PreorderTraversal(TreeNode* root) {
vector<int> re;
stack<TreeNode*> s;
if(root==NULL) return re;
TreeNode* cur=root;
while(!s.empty()||cur!=NULL){
while(cur!=NULL){
s.push(cur);
re.push_back(cur->val);//第一次遇到就放入
cur=cur->left;
}
TreeNode* node=s.top();
s.pop();
cur=node->right;
}
return re;
}
非递归后序遍历:
vector<int> PostorderTraversal(TreeNode* root) {
vector<int> re;
stack<TreeNode*> s;
if(root==NULL) return re;
TreeNode* cur=root;//用于遍历树的指针
TreeNode* pre=NULL;//记录前面序号的节点
while(!s.empty()||cur!=NULL){
while(cur!=NULL){
s.push(cur);//第一次遇到不访问
cur=cur->left;
}
TreeNode* node=s.top();
if(node->right==NULL){//没有右节点,当作第三次访问
s.pop();
re.push_back(node->val);
pre=node;
cur=NULL;
}else{
//如果是第二次访问
if(pre==NULL||node->right!=pre){
cur=node->right;
}else{//如果第三次访问
s.pop();
re.push_back(node->val);
pre=node;
cur=NULL;
}
}
}
return re;
}
非递归中序遍历:
vector<int> InorderTraversal(TreeNode* root) {
vector<int> re;
stack<TreeNode*> s;
if(root==NULL) return re;
TreeNode* cur=root;//用于遍历树的指针
TreeNode* pre=NULL;//记录前面序号的节点
while(!s.empty()||cur!=NULL){
while(cur!=NULL){
s.push(cur);//第一次遇到不访问
cur=cur->left;
}
TreeNode *node=s.top();
s.pop();//第二次遇到就应该访问
re.push_back(node->val);
cur=node->right;
}
return re;
}