1.层序遍历
利用队列来实现
void levelorder(TreeNode *root){
queue<TreeNode*> q;
q.push(root);//首先将根节点入队
while(!q.empty()){//循环从队首取出结点
TreeNode *t = q.front();
q.pop();
cout<<t->val<<' ';
//结点出队后,入队该结点的左孩子和右孩子
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
}
2.前序遍历(非递归)
利用栈来实现(根左右)
void preorder(TreeNode *root){
stack<TreeNode*> s;
s.push(root);//首先将根节点入栈
while(!s.empty()){
TreeNode *t=s.top();
s.pop();
cout<<t->val<<' ';
先输出结点的左孩子再输出结点的右孩子
if(t->right) s.push(t->right);//先将结点的右孩子入栈
if(t->left) s.push(t->left);//再将结点的左孩子入栈
}
}
3.中序遍历(非递归)
利用栈来实现(左根右)
void inorder(TreeNode *root){
stack<TreeNode*> s;
TreeNode *cur = root;
while(cur||!s.empty()){
//把当前结点以及它的左子结点全部入栈
while(cur){
s.push(cur);
cur=cur->left;
}
//从栈中弹出一个结点计算
cur=s.top();
s.pop();
cout<<cur->val<<' ';
//让当前节点指向右子结点
cur=cur->right;
}
}
4.后续遍历(非递归)
利用栈来实现(左右根)
void postorder(TreeNode *root){
stack<TreeNode*> s;
TreeNode *cur = root;
TreeNode *pre = NULL;
while(cur||!s.empty()){
//将当前结点及其左子结点全部入栈
while(cur){
s.push(cur);
cur=cur->left;
}
cur=s.top();
//如果栈顶结点没有右子结点或者右子结点已经访问完了
if(!cur->right||cur->right==pre){
s.pop();
cout<<cur->val<<' ';
pre=cur;
cur=NULL:
}//有右子结点并且还没有访问
else cur=cur->right;
}
}