单链表递归逆序实现代码:
#include <iostream> using namespace std; struct node { int data; node*next; } /* optional variable list */; node* reverse(node * head) { if(head==NULL || head->next==NULL) return head; node* tail= head->next; node* newHead= reverse(head->next); tail->next=head; head->next=NULL; return newHead; } int main(int argc, const char *argv[]) { node * h=NULL; node * p = NULL; int i ; for (i = 0; i < 10; i++) { if (h==NULL) { h = new node(); h->data=i; h->next=NULL; p=h; } else { p->next=new node(); p=p->next; p->data=i; p->next=NULL; } } h= reverse(h); for (p=h;p;p=p->next) { cout<<p->data<<endl; } return 0; }
树非递归遍历
前序非递归:
void PreOrder2(BTNode *b) { BTNode *St[MaxSize],*p; int top=-1; top++; St[top]=b; //根结点入栈 while (top>-1) //栈不为空时循环 { p=St[top]; top--; //退栈并访问该结点 printf("%c ",p->data); if (p->rchild!=NULL) //右孩子结点入栈 { top++; St[top]=p->rchild; } if (p->lchild!=NULL)//左孩子结点入栈 { top++; St[top]=p->lchild; } } }
中序非递归:
由中序遍历过程可知,采用一个栈保存需要返回的结点指针,先扫描(并非访问)根结点的所有左结点并将它们一一进栈。 然后出栈一个结点,显然该结点没有左孩子结点或者左孩子结点已访问过(进一步说明该结点的左子树均已访问),则访问它。然后扫描该结点的右孩子结点,将其进栈,再扫描该右孩子结点的所有左结点并一一进栈,如此这样,直到栈空为止
void PreOrder2(BTNode *b) void InOrder2(BTNode *b) { BTNode *St[MaxSize],*p; int top=-1; p=b; while (top>-1 || p!=NULL) { while (p!=NULL) //扫描*p的所有左结点并进栈 { top++; St[top]=p; p=p->lchild; } if (top>-1) { p=St[top];top--; //出栈*p结点 printf("%c ",p->data); //访问之 p=p->rchild; //扫描*p的右孩子结点 } } }
后序非递归:
由后遍历过程可知,采用一个栈保存需要返回的结点指针,先扫描根结点的所有左结点并一一进栈,出栈一个结点*b即当前结点,然后扫描该结点的右孩子结点并入栈,再扫描该右孩子结点的所有左结点并入栈。当一个结点的左右孩子结点均访问后再访问该结点,如此这样,直到栈空为止。 难点:如何判断一个结点*b的右孩子结点已访问过,为此用p保存刚刚访问过的结点(初值为NULL),若b->rchild==p成立(在后序遍历中,*b的右孩子结点一定刚好在*b之前访问),说明*b的左右子树均已访问,现在应访问*b。
void PreOrder2(BTNode *b) void PostOrder2(BTNode *b) { BTNode *St[MaxSize];BTNode *p; int flag,top=-1; //栈指针置初值 do { while (b!=NULL) //将*b的所有左结点进栈 { top++; St[top]=b; b=b->lchild; } p=NULL; //p指向栈顶结点的前一个已访问的结点 flag=1; //设置b的左孩子为已访问过 while (top!=-1 && flag==1) { b=St[top]; //取出当前的栈顶元素 if (b->rchild==p) { printf("%c ",b->data); //访问*b结点 top--;p=b; //p指向则被访问的结点 } else { b=b->rchild; //b指向右孩子结点 flag=0; //设置b的左孩子未访问 } } } while (top!=-1); }