二叉树的遍历
今天要给大家分享的是二叉树的遍历,仍然希望大家可以喜欢,有什么问题,欢迎大家留言,或者私信我。让我们一起学习编程吧
1.二叉树类型定义
- 二叉树除了有一个头结点之外,还有左孩子和有孩子结点
- 根据这个思路,我们可以定义 二叉树的类型
typedef struct BTNode
{
ElemType data;
struct BTNode* lchild, * rchild;
}BTNode;
2.创建二叉树
- 我们把一个字符数组赋给二叉树
- 注意:输入的格式a(b,c)
- a为头结点,b为左孩子结点,c为右孩子结点
void CreateBTNode(BTNode*& b,char* str)
{
BTNode* St[MaxSize],* p=NULL;
int top = -1,k=0,j = 0;
char ch;
b = NULL; //建立的二叉链初始时为空
ch = str[j];
while (ch != '\0') //str未扫描完时循环
{
switch (ch)
{
case '(': top++; St[top] = p; k = 1; break; //可能有左孩子结点,进栈
case ')': top--; break;
case ',': k = 2; break;
default: //遇到结点值
p = (BTNode*)malloc(sizeof(BTNode));//分配存储空间
p->data = ch; p->lchild = p->rchild = NULL;
if (b == NULL) //p为二叉树的根结点
b = p;
else //已建立二叉树根结点
{
switch (k)
{
case 1: St[top]->lchild = p; break;
case 2: St[top]->rchild = p; break;
}
}
}
j++; ch = str[j]; //继续扫描str
}
}
3.先序遍历,中序遍历,后序遍历
- 遍历的代码用了递归的思想
- 大家可以看一下其他大佬对于递归的总结,在这里就不多讲了
void PreOrder(BTNode* b)
{
if (b != NULL)
{
printf("%c ",b->data); //访问根结点
PreOrder(b->lchild);
PreOrder(b->rchild);
}
}