二叉树的递归和非递归遍历(前序、中序、后序)

来源:互联网 发布:淘宝店铺怎么改类目 编辑:程序博客网 时间:2024/04/30 11:17

1.前序遍历

//前序遍历递归形式void PreOderTraversal(Node<T> *root){   if(root)      {cout<<root->data<<" ";PreOderTraversal(root->lTreeNode);PreOderTraversal(root->rTreeNode);  }    }//前序遍历的非递归形式void PreOderTraversal1(Node<T> *root){stack<Node<T>*> tree;Node<T> *p = root;while(p!=NULL || !tree.empty()){while(p!=NULL){cout<<p->data<<" ";tree.push(p);p = p->lTreeNode;}p = tree.top();tree.pop();p = p->rTreeNode;}}

2.中序遍历

//中序遍历递归形式void InOderTraversal(Node<T> *root){  if(root)  {InOderTraversal(root->lTreeNode);cout<<root->data<<" ";InOderTraversal(root->rTreeNode);  }     }//中序遍历的非递归形式void InOderTraversal1(Node<T> *root){stack<Node<T>*> tree;Node<T> *p = root;while(p!=NULL || !tree.empty()){while(p!=NULL){tree.push(p);p = p->lTreeNode;}p = tree.top();tree.pop();cout<<p->data<<" ";p = p->rTreeNode;     }}

3.后序遍历

//后序遍历递归形式void PostOderTraversal(Node<T> *root)   { if(root) {PostOderTraversal(root->lTreeNode);PostOderTraversal(root->rTreeNode);cout<<root->data<<" "; }   }   //后序遍历的非递归形式void PostOderTraversal1(Node<T> *root)   {   stack<Node<T>*> tree;   Node<T> *p = root;   Node<T> *r = NULL;   while(p!=NULL || !tree.empty())   {   while(p!=NULL)//一直向左遍历到底   {   tree.push(p);   p = p->lTreeNode;   }   p=tree.top(); //取栈顶值   if(p->rTreeNode && p->rTreeNode!=r)//如果有未访问过的右子树,将其设置为p   {   p = p->rTreeNode;   }   else//如果没有右子树或者右子树已经访问过了,则输出,并将p置为NULL。   {   tree.pop();   cout<<p->data<<" ";   r = p;   p = NULL;   }   }}

                                             
0 0
原创粉丝点击