三种遍历方式
L:代表左结点;
D:代表根结点;
R:代表右结点;
(1) 前序遍历:DLR(先遍历根结点,之后遍历左结点,最后遍历 右结点)
(2)中序遍历:LDR(先遍历左结点,之后遍历根结点,最后遍历 右结点)
(3)后序遍历:LRD(先遍历左结点,之后遍历右结点,最后遍历 根结点)
下面为代码
#include <stdio.h>
#include <stdlib.h>
typedef char Elemtype;
typedef struct treeNode {
Elemtype data;
treeNode* left, * right;
}treeNode, * treeList;
void creatTree(treeList& T) {
Elemtype x;
scanf("%c", &x);
if (x == '#') {
T = NULL;
}
else {
T = (treeList)malloc(sizeof(treeNode));//分配空间
if (!T) exit(-2);//分配空间失败
T->data = x;
creatTree(T->left);
creatTree(T->right);
}
}
void DLR(treeList T) {
if (T == NULL) {
return;
}
else {
printf("%c ", T->data);
DLR(T->left);
DLR(T->right);
}
}
void LDR(treeList T) {
if (T == NULL) {
return;
}
else {
LDR(T->left);
printf("%c ", T->data);
LDR(T->right);
}
}
void LRD(treeList T) {
if (T == NULL) {
return;
}
else {
LRD(T->left);
LRD(T->right);
printf("%c ", T->data);
}
}
int main()
{
treeList T;
printf("创建一个二叉树:\n");
creatTree(T);
printf("先序遍历:");
DLR(T);
puts("");
printf("中序遍历:");
LDR(T);
puts("");
printf("后序遍历:");
LRD(T);
puts("");
return 0;
}
样例
其实三种遍历方式的代码差不多,只是输出位置不同。
如有错误请您指正,谢谢!
下面是含有树的结点数,叶子结点数,深度的代码
#include <stdio.h>
#include <stdlib.h>
typedef char Elemtype;
typedef struct treeNode
{
Elemtype data;
treeNode* left, * right;
}treeNode, * treeList;
int m, maxi, jie = 0, ye = 0;
treeList temp;
void creatTree(treeList& T)
{
Elemtype x;
scanf("%c", &x);
if (x == '#') {
T = NULL;
}
else {
T = (treeList)malloc(sizeof(treeNode));//分配空间
if (!T) exit(-2);//分配空间失败
T->data = x;
creatTree(T->left);
creatTree(T->right);
}
}
void DLR(treeList T)
{
if (T == NULL) {
return;
}
else {
printf("%c ", T->data);
DLR(T->left);
DLR(T->right);
}
}
void LDR(treeList T)
{
if (T == NULL) {
return;
}
else {
LDR(T->left);
printf("%c ", T->data);
LDR(T->right);
}
}
void LRD(treeList T)
{
if (T == NULL) {
return;
}
else {
LRD(T->left);
LRD(T->right);
printf("%c ", T->data);
}
}
int findjie(treeList T)
{
if (T == NULL) return 0;
jie++;
findjie(T->left);
findjie(T->right);
return jie;
}
int findye(treeList T)
{
if (T == NULL) return 0;
if (T->left == NULL && T->right == NULL)
ye++;
else
{
findye(T->left);
findye(T->right);
}
return ye;
}
int Traverse(treeList T)
{
if (T)
{
m++;
if (m > maxi)
{
maxi = m;
temp = T;
}
Traverse(T->left);
Traverse(T->right);
m--;
}
}
int main()
{
treeList T;
printf("创建一个二叉树:\n");
creatTree(T);
printf("先序遍历:");
DLR(T);
puts("");
printf("中序遍历:");
LDR(T);
puts("");
printf("后序遍历:");
LRD(T);
puts("");
Traverse(T);
printf("结点数%d\n叶子结点数%d\n", findjie(T), findye(T));
printf("深度为%d\n", maxi);
return 0;
}