//非递归算法的二叉树 前序、中序、后续查找 void preorder1(btnode *b)//前序遍历1 { /*由先序遍历过程可知,先访问根节点,再遍历左子树,最后遍历右子树,由于在二叉链中左右子树是通过根结点的指针域指向的,在访问根节点后后遍历左子树会丢失右子树的节点,需要使用一个栈来临时保存左右子树的地址 由于栈是先进后出的,而先序遍历是先遍历左子树后遍历右子树,所以当访问完一个非叶子节点后应先将右孩子进栈,再将其左孩子进栈;*/ btnode *p=b; stack<btnode>stack; if(b!=NULL) { stack.push(b); while(!stack.empty()) { p=stack.pop(); cout<<p->date<<' '; if(p->rchild!=NULL) stack.push(p->rchild); if(p->lchild!=NULL) stack.push(p->lchild); } cout<<endl; } //stack.clear(); } void preorder2(btnode *b)//前序遍历2 { /*此时当前栈顶节点要么没有左子树要么左子树已经被遍历,所以转向他的右子树*/ btnode *p=b; stack<btnode>stack; while(!stack.empty()||p!=NULL) { while(p!=NULL)//if(p!=NULL) { cout<<p->date<<' '; stack.push(p); p=p->lchild; } if(!stack.empty())//else { p=stack.pop(); p=p->rchild; } } cout<<endl; //stack.clear(); } //中序遍历 void inorder(btnode *b) { btnode *p=b; stack<btnode>stack; while(p!=NULL||!stack.empty()) { while(p!=NULL) { stack.push(p); p=p->lchild; } if(!stack.empty()) { p=stack.pop(); cout<<p->date<<' '; p=p->rchild; } } cout<<endl; //stack.clear(); }
http://www.cnblogs.com/liuamin/p/6383315.htmlvoid postorder(btnode *b)//后序遍历 { /*后序遍历算法中即使栈顶节点的左子树已经遍历或者为空,仍然还不能访问节点p,因为他们的右子树没有遍历,只有当这样的p节点右子树已经遍历完之后才能遍历节点p 那么需要解决2个问题,一是如何判断处理当前结点是栈顶节点,这儿设置了一个bool变量,开始置flag为true,表示访问的是站定节点,一旦转向处理右子树节点则置false 还有一个是判断当前访问的节点的右子树是否已经被访问过(或者右子树为空),如果访问过则可以访问当前的节点, 为此设置一个指针变量r,初始值为NULL,让他指向刚刚被访问过的节点,对于正在处理的节点,若p->rchild=r;则p的左右节点都被访问过了。*/ btree *p=b; do { while(p!=NULL) { stack.push(p); p=p->lchild; } bool flag=true;//表示当前访问的是栈顶节点 btnode *r=NULL;//表示当前访问的节点的上一个节点是r,(r是刚刚被访问过的节点) while(!stack.empty()&&true) { p=stack.top(); if(p->rchild==r) { stack.pop(); cout<<p->date; r=p;//r指向当前被访问过的节点 } else { p=p->rchild; flag=false; } } }while(!=stack.empty()) //stack.clear(); }
/*采用二叉链的存储结构,设计算法输出从根节点到叶子结点的逆序列,, 采用后序遍历的方法实现*/ void psotbtree(btree *b) { stack<*btree>stack; btree *p=b; do { while(p!=NULL) { stack.push(p); p=p->lchild; } bool flag=true; btree *r=NULL; while(!stack.empty&&flag) { p=stack.top(); if(p->rchild==r) { if(p->rchild==NULL&&p->lchild==NULL) //定义一个迭代器,输出栈中的所有元素 stack.pop(); r=p; } else { p=p->rchild; flag=true; } } }while(!stack.empty()) }
二叉树的非递归遍历
最新推荐文章于 2023-04-19 13:56:53 发布