首页 > 代码库 > 最基础的算法练习1

最基础的算法练习1

二叉树的几种递归和非递归式遍历:

  1 #include <fstream>  2 #include <iostream>  3   4 using namespace std;  5   6 /*  7     后序遍历的非递归实现是三种遍历方式中最难的一种。因为在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子  8 前访问才能访问根结点,这就为流程的控制带来了难题。下面介绍两种思路。  9     第一种思路:对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶, 10 但是此时不能将其出栈并访问,因此其右孩子还为被访问。所以接下来按照相同的规则对其右子树进行相同的处理,当访问完其右孩子 11 时,该结点又出现在栈顶,此时可以将其出栈并访问。这样就保证了正确的访问顺序。可以看出,在这个过程中,每个结点都两次出现 12 在栈顶,只有在第二次出现在栈顶时,才能访问它。因此需要多设置一个变量标识该结点是否是第一次出现在栈顶。 13     第二种思路:要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子, 14 则可以直接访问它;或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种 15 情况,则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结 16 点前面被访问。 17 */ 18  19 #define queue_len 100 20  21 struct node 22 { 23     char c; 24     struct node *lch,*rch; 25     bool flag; 26     node():flag(0){} 27     void get_c() 28     { 29         printf("%c",c); 30     } 31 }; 32  33 node* set_tree();//建树 34 void pre_order(node* tree);//先序遍历 35 void in_order(node* tree);//中序遍历 36 void post_order(node* tree);//后序遍历 37 void level_order(node* tree);//层次遍历 38 void nr_pre_order(node* tree);//非递归先序遍历 39 void nr_in_order(node* tree);//非递归中序遍历 40 void nr_post_order_1(node* tree);//非递归后序遍历 41 void nr_post_order_2(node* tree);//非递归后序遍历 42  43 int main() 44 { 45     //freopen("D:\\input.in","r",stdin); 46     //freopen("D:\\output.out","w",stdout); 47     node* tree=set_tree(); 48     printf("先序遍历:"); 49     pre_order(tree); 50     puts(""); 51     printf("中序遍历:"); 52     in_order(tree); 53     puts(""); 54     printf("后序遍历:"); 55     post_order(tree); 56     puts(""); 57     printf("层次遍历:"); 58     level_order(tree); 59     puts(""); 60     printf("先序遍历:"); 61     nr_pre_order(tree); 62     puts(""); 63     printf("中序遍历:"); 64     nr_in_order(tree); 65     puts(""); 66     printf("后序遍历:"); 67     nr_post_order_1(tree); 68     puts(""); 69     printf("后序遍历:"); 70     nr_post_order_2(tree); 71     puts(""); 72     return 0; 73 } 74 node* set_tree() 75 { 76     node* p,*s; 77     node* gen=new node; 78     gen->c=A; 79  80     gen->lch=new node; 81     p=gen->lch; 82     p->c=B; 83     p->rch=NULL; 84     p->lch=new node; 85     p=p->lch; 86     p->c=D; 87     p->lch=NULL; 88     p->rch=new node; 89     p=p->rch; 90     p->c=G; 91     p->lch=NULL; 92     p->rch=NULL; 93  94     gen->rch=new node; 95     p=gen->rch; 96     p->c=C; 97     p->lch=new node; 98     s=p->lch; 99     s->c=E;100     s->lch=NULL;101     s->rch=NULL;102     p->rch=new node;103     s=p->rch;104     s->c=F;105     s->lch=NULL;106     s->rch=NULL;107 108     return gen;109 }110 void pre_order(node* tree)111 {112     if(tree!=NULL)113     {114         tree->get_c();115         pre_order(tree->lch);116         pre_order(tree->rch);117     }118 }119 void in_order(node* tree)120 {121     if(tree!=NULL)122     {123         in_order(tree->lch);124         tree->get_c();125         in_order(tree->rch);126     }127 }128 void post_order(node* tree)129 {130     if(tree!=NULL)131     {132         post_order(tree->lch);133         post_order(tree->rch);134         tree->get_c();135     }136 }137 void level_order(node* tree)138 {139     node* queue_1[queue_len];140     int front,rear;141 142     if(tree==NULL)  return;143     front=-1;144     rear=0;145     queue_1[rear]=tree;146     while(front!=rear)147     {148         front++;149         queue_1[front]->get_c();150 151         if(queue_1[front]->lch!=NULL)152         {153             rear++;154             queue_1[rear]=queue_1[front]->lch;155         }156         if(queue_1[front]->rch!=NULL)157         {158             rear++;159             queue_1[rear]=queue_1[front]->rch;160         }161     }162 }163 void nr_pre_order(node* tree)164 {165     node* stack_1[queue_len];166     int top=-1;167 168     if(tree==NULL)  return;169     node* p=tree;170     while(p!=NULL||top!=-1)171     {172         while(p!=NULL)173         {174             p->get_c();175             stack_1[++top]=p;176             p=p->lch;177         }178         if(top==-1) return;179         p=stack_1[top--]->rch;180     }181 }182 void nr_in_order(node* tree)183 {184     node* stack_1[queue_len];185     int top=-1;186 187     if(tree==NULL)  return;188     node* p=tree;189     while(p!=NULL||top!=-1)190     {191         while(p!=NULL)192         {193             stack_1[++top]=p;194             p=p->lch;195         }196         if(top==-1) return;197         stack_1[top]->get_c();198         p=stack_1[top--]->rch;199     }200 }201 void nr_post_order_1(node* tree)202 {203     node* stack_1[queue_len];204     int top=-1;205 206     if(tree==NULL)  return;207     node* p=tree;208     while(p!=NULL||top!=-1)209     {210         while(p!=NULL)211         {212             stack_1[++top]=p;213             p=p->lch;214         }215         if(top==-1) return;216         p=stack_1[top];217         if(p->flag==0)  {p->flag=1;p=p->rch;}218         else   { p->get_c(),top--;p=NULL;}219     }220 }221 void nr_post_order_2(node* tree)222 {223     node* stack_1[queue_len];224     int top=0;225 226     if(tree==NULL)  return;227     node* p=tree;228     while(top!=-1)229     {230         p=stack_1[top];231         if((p->lch==NULL||p->lch->flag==0)&&(p->rch==NULL||p->rch->flag==0))232         {233             p->get_c();234             p->flag=0;235             top--;236         }237         else238         {239             if(p->rch!=NULL)240             {241                 stack_1[++top]=p->rch;242             }243             if(p->lch!=NULL)244             {245                 stack_1[++top]=p->lch;246             }247         }248     }249 }
View Code

 

最基础的算法练习1