二叉树的递归与非递归遍历
2016-10-03 11:24
274 查看
前序遍历
规则:根左右//递归前序遍历
void preOrder(BinTree *root) { if(root!=NULL) { cout<<root->data<<" "; if(root->lchild) preOrder(root->lchild); if(root->rchild) preOrder(root->rchild); } }
//非递归前序遍历
//思路 /* (1)访问结点P,并将结点P入栈,输出p节点的值; (2)判断结点P的左孩子是否为空, 若为空,则取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P 若不为空,则将P的左孩子置为当前的结点P (3)循环至(1-2)直到P为NULL并且栈为空,则遍历结束。 */ void preOrder(BinTree *root) { stack<BinTree*> s; BinTree *p=root; while(p!=NULL ||!s.empty()) { s.push(p); cout<<p->data<<" "; if(p->lchild){ p=p->lchild; }else{ p=s.top(); s.pop(); p=p->rchild; } } }
中序遍历
规则:左根右//递归中序遍历 void midOrder(BinTree *root) { if(root!=NULL) { if(root->lchild) preOrder(root->lchild); cout<<root->data<<" "; if(root->rchild) preOrder(root->rchild); } }
//非递归中序遍历 /* 思路 (1)访问结点P,并将结点P入栈; (2)判断结点P的左孩子是否为空, 若为空,输出p节点的值,且取栈顶结点并进行出栈操作,并将栈顶结点的右孩子置为当前的结点P 若不为空,则将P的左孩子置为当前的结点P (3)循环至(1-2)直到P为NULL并且栈为空,则遍历结束。 */ void midOrder(BinTree *root) { stack<BinTree*> s; BinTree *p=root; while(p!=NULL ||!s.empty()) { s.push(p); if(p->lchild){ p=p->lchild; }else{ cout<<p->data; p=s.top(); s.pop(); p=p->rchild; } } }
后序遍历
规则:左右根//递归后序遍历 void afterOrder(BinTree *root) { if(root!=NULL) { if(root->lchild) preOrder(root->lchild); if(root->rchild) preOrder(root->rchild); cout<<root->data<<" "; } }
//非递归后序遍历 /* 思路 (1)首先对于任一结点P,先将其入栈。 (2)对应节点P 若不存在左孩子和右孩子,则可以直接访问它; 若存在左孩子或者右孩子,但是其左孩子和右孩子都已遍历过,则直接访问它 否则,则将P的右孩子和左孩子依次入栈 (3)循环至(1-2)直到栈为空,则遍历结束。 */ void afterOrder(BinTree *root) { stack<BinTree*> s; BinTree *p=root; s.push(p); while(s.empty()) { if((!p->rchild && !p->lchild) || (p->rchild->isLoop || p->lchild->isLoop)){ cout<<cur->data<<" "; p->isLoop=true; s.pop(); p=s.top(); }else{ if(p->rchild){ p=p->rchild; s.push(p); } if(p->lchild){ p=p->lchild; s.push(p); } } } }
相关文章推荐
- C语言实现二叉树的递归遍历与非递归遍历
- Java实现二叉树的递归、非递归遍历
- 实现二叉树的前序/中序/后序递归、非递归遍历
- 数据结构中二叉树的递归遍历与非递归遍历
- 二叉树的创建,递归和非递归遍历
- 【数据结构与算法】二叉树递归与非递归遍历(附完整源码)
- Java实现二叉树的创建、递归/非递归遍历
- 二叉树的递归和非递归遍历(java)
- Java实现二叉树的递归与非递归遍历
- javascript实现二叉树递归遍历和非递归遍历
- 二叉树递归遍历和非递归遍历
- 二叉树 先、中、后序递归和非递归遍历
- 二叉树的非递归遍历及其递归遍历
- 前、中、后、序递归遍历二叉树以及非递归遍历
- 二叉树递归遍历与非递归遍历(终极版)
- 二叉树的递归遍历以及非递归遍历(一)----先序遍历(转)
- 二叉树的前序中序后序的递归和非递归遍历
- Java 二叉树的四种递归与非递归遍历
- 二叉树的递归与非递归遍历(Java描述)
- 二叉树的递归和非递归遍历