c++ 树的各种递归遍历以及非递归遍历
前序遍历(根左右):
void InOrderTree(Node* root){ if(root!=NULL){ preOrderTree(root->left); cout<<root->data<<" "; preOrderTree(root->right); } } void InOrderTree(){ stact<Node*> s; Node* p=root; while(p!=NULL||!s.empty()){ while(p!=NULL){ s.push(p); p=p->left; } if(!s.empty()){ p=s.top(); cout<<p->data<<" "; s.pop(); p=p->right; } } }
后序遍历(左右根):
void PostOrderTree(Node* root){ if(root!=NULL){ preOrderTree(root->left); preOrderTree(root->right); cout<<root->data<<" "; } } void PostOrderTree(){//初始每个结点的tag为0,tag=1表示此节点的右子树已经遍历。 stack<Node*> s; Node* p=root; while(p!=NULL||!s.empty()){ while(p!=NULL){ p.push(p); p=p->left; } if(!s.empty()){ p=s.top(); if(p->tag){ cout<<p->data<<" "; s.pop(); p=NULL; } else{ p->tag=1; p=p->right; } } } }
层次遍历:
void LevelOrderTree(){ queue<Node*> q; Node* p=NULL; q.push(root); while(!q.empty()){ p=q.front(); q.pop(); if(p->left!=NULL) q.push(p->left); if(p->right!=NULL) q.push(p->right); } }
中序遍历(左根右):

浙公网安备 33010602011771号