通常做题,遇到最多的是已知树的前序遍历和中序遍历 或者 中序遍历和后序遍历,求这棵树的遍历,可以确定的是,无论是哪种情况,必须确定树的中序遍历,如 图1-1树 所示:
以前序遍历和中序遍历举例,无疑前序遍历第一个元素就是各节点,但是无法确定的是那一边是右子节点,或者左子树的终点。那么可以从中序遍历开始,找到根节点,在其左边一定是左子节点,右边一定是右子节点,从而一次递推。中序遍历与后序遍历亦然。
已知前序遍历,表明空节点,求后序遍历与中序遍历:
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- #include <iostream>
-
- using namespace std;
-
- char a[100];
- int shu;
- struct node
- {
- int data;
- struct node *l, *r;
- };
-
- struct node *create()
- {
- struct node *root;
- char c;
- c = a[shu++];
- if(c == ',')
- {
- return NULL;
- }
- else
- {
- root = new struct node;
- root->data = c;
- root->l = create();
- root->r = create();
- }
- return root;
- }
-
- void before(struct node *root)
- {
- if(root)
- {
- printf("%c", root->data);
- before(root->l);
- before(root->r);
- }
- };
-
- void mid(struct node *root)
- {
- if(root)
- {
- mid(root->l);
- printf("%c", root->data);
- mid(root->r);
- }
- }
-
- void after(struct node *root)
- {
- if(root)
- {
- after(root->l);
- after(root->r);
- printf("%c", root->data);
- }
- }
-
- int main()
- {
- struct node *root;
- scanf("%s", a);
- shu = 0;
- root = new struct node;
- root = create();
- printf("树的前序遍历:");
- before(root);
- printf("\n");
- printf("树的中序遍历:");
- mid(root);
- printf("\n");
- printf("树的后序遍历:");
- after(root);
- printf("\n");
- return 0;
- }
-
-
已知树的前序遍历和中序遍历,求树的深度、后序遍历、层序遍历:
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- #include <iostream>
-
- using namespace std;
-
- struct node
- {
- char data;
- struct node *l, *r;
- };
- struct node *create(int n, char a[], char b[])
- {
- struct node *root;
- int i;
- if(!n)
- {
- return NULL;
- }
- for(i = 0;i < n;i++)
- {
- if(b[i] == a[0])
- {
- break;
- }
- }
- root = new struct node;
- root->data = a[0];
- root->l = create(i, a+1, b);
- root->r = create(n-i-1, a+i+1, b+i+1);
- return root;
- };
- int deep(struct node *root)
- {
- int d = 0;
- if(root)
- {
- int l1 = deep(root->l);
- int l2 = deep(root->r);
- d = l1>l2 ? l1+1 : l2+1;
- }
- return d;
- }
-
- void after(struct node *root)
- {
- if(root)
- {
- after(root->l);
- after(root->r);
- cout<<root->data;
- }
- }
-
- void cengci(struct node *root)
- {
- struct node *temp[100];
- int in = 0, out = 0;
- temp[in++] = root;
- while(in > out)
- {
- if(temp[out])
- {
- printf("%c", temp[out]->data);
- temp[in++] = temp[out]->l;
- temp[in++] = temp[out]->r;
- }
- out++;
- }
- }
-
- int main()
- {
- int n, m;
- char a[101], b[101];
- while(~scanf("%d", &n))
- {
- struct node *root;
- scanf("%s", a);
- scanf("%s", b);
- root = create(n, a, b);
- m = deep(root);
- printf("树的深度为:%d\n", m);
- printf("后序遍历:\n");
- after(root);
- printf("\n");
- printf("层序遍历:\n");
- cengci(root);
- }
- return 0;
- }
-
-
已知树的中序遍历和后序遍历,求树的深度、前序遍历、层序遍历:
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- #include <iostream>
-
- using namespace std;
-
- struct node
- {
- char data;
- struct node *l, *r;
- };
- struct node *create(int n, char a[], char b[])
- {
- struct node *root;
- int i;
- if(!n)
- {
- return NULL;
- }
- else
- {
- root = (struct node *)malloc(sizeof(struct node));
- root->data = a[n-1];
- for(i = 0;i < n;i++)
- {
- if(a[n-1] == b[i])
- {
- break;
- }
- }
- root->l = create(i, a, b);
- root->r = create(n-i-1, a+i, b+i+1);
- }
- return root;
- }
- int deep(struct node *root)
- {
- int d = 0;
- if(root)
- {
- int l1 = deep(root->l);
- int l2 = deep(root->r);
- d = l1>l2 ? l1+1 : l2+1;
- }
- return d;
- }
-
- void before(struct node *root)
- {
- if(root)
- {
- cout<<root->data;
- before(root->l);
- before(root->r);
- }
- }
-
- void cengci(struct node *root)
- {
- struct node *temp[100];
- int in = 0, out = 0;
- temp[in++] = root;
- while(in > out)
- {
- if(temp[out])
- {
- printf("%c", temp[out]->data);
- temp[in++] = temp[out]->l;
- temp[in++] = temp[out]->r;
- }
- out++;
- }
- }
-
- int main()
- {
- int n, m;
- char a[101], b[101];
- while(~scanf("%d", &n))
- {
- struct node *root;
- scanf("%s", b);
- scanf("%s", a);
- root = create(n, a, b);
- m = deep(root);
- printf("树的深度为:%d\n", m);
- printf("前序遍历:\n");
- before(root);
- printf("\n");
- printf("层序遍历:\n");
- cengci(root);
- }
- return 0;
- }
-
-