公式化的过程,需要理解记忆。
扩展先序遍历
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct TNode
{
char data;
struct TNode* lchild, * rchild;
}TNode, *LinkTree;
void Creat(LinkTree* T);
void InOrderTraverse(LinkTree T);
int main()
{
LinkTree T;
Creat(&T);
InOrderTraverse(T);
return 0;
}
void Creat(LinkTree* T)
{
char ch;
scanf("%c", &ch);
if (ch == '#')
T = NULL;
else
{
*T = (LinkTree)malloc(sizeof(TNode));
(*T)->data = ch;
(*T)->lchild = NULL;
(*T)->rchild = NULL;
Creat(&((*T)->lchild));
Creat(&((*T)->rchild));
}
}
void InOrderTraverse(LinkTree T)
{
if (T != NULL)
{
InOrderTraverse(T->lchild);
printf("%c ", T->data);
InOrderTraverse(T->rchild);
}
}
二叉树遍历
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct BiTNode
{
char data;
struct BiTNode* lchild, * rchild;
}BiTNode, *LinkTree;
BiTNode* Creat(char* pre, char* in, int n);
void PostoOrderTraverse(BiTNode* T);
int main()
{
char pre[30], in[30];
scanf("%s", pre);
scanf("%s", in);
BiTNode* T = Creat(pre, in, strlen(pre));
PostoOrderTraverse(T);
return 0;
}
BiTNode* Creat(char* pre, char* in, int n)
{
BiTNode* s;
char* p;
int k;
if (n == 1)
{
s = (BiTNode*)malloc(sizeof(BiTNode));
s->data = *pre;
s->lchild = s->rchild = NULL;
return s;
}
for (p = in; p < in + n; p++)
{
if (*p == *pre)
break;
}
k = p - in;
s = (BiTNode*)malloc(sizeof(BiTNode));
s->data = *pre;
s->lchild = s->rchild = NULL;
if (k)
s->lchild = Creat(pre + 1, in, k);//左子树
if (n - k - 1)
s->rchild = Creat(pre + k + 1, p + 1, n - k - 1);//右子树
return s;
}
void PostoOrderTraverse(BiTNode* T)
{
if (T != NULL)
{
PostoOrderTraverse(T->lchild);
PostoOrderTraverse(T->rchild);
printf("%c", T->data);
}
}