方法1:头指针指向二叉树根节点 - 正常思维
#include <stdio.h>
#include <stdlib.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode, *BiTree;
/* 按照前序遍历二叉树中节点的值 */
void PreOrderTrav(BiTree T)
{
if(T == NULL)
return;
printf("prev traverse begin:...\n");
/* Step1:打印节点数据 */
printf("%c\n", T->data);
/* Step2:遍历左子树 */
PreOrderTrav((T -> lchild));
printf("prev traverse left:...\n");
/* Step3:遍历右子树 */
PreOrderTrav((T -> rchild));
printf("prev traverse right:...\n");
}
/* 按照前序输入二叉树中节点的值 */
void CreatBiTree(BiTree *HeadPtr)
{
char ch;
// BiTree BiTreeHeadPtr = NULL;
scanf("%c", &ch);
printf("%c\n", ch);
if(ch == '#')
*HeadPtr = NULL;
else
{
(*HeadPtr) = (BiTree)malloc(sizeof(BiTNode));
if(*HeadPtr == NULL)
exit(-1);
printf(" *HeadPtr = %p\n", *HeadPtr);
(*HeadPtr)->data = ch; /* 生成根节点 */
CreatBiTree( &((*HeadPtr)->lchild) );
CreatBiTree( &((*HeadPtr)->rchild) );
printf("insert op. over!\n");
}
}
int main()
{
/* 建立一个头指针 */
BiTree *HeadPtr = (BiTree *)malloc(sizeof(BiTNode));
if(HeadPtr == NULL)
return (0);
printf("---1---\n");
/* 创建一个二叉树 */
CreatBiTree(HeadPtr);
printf("---2---\n");
/* 前序遍历该二叉树 */
PreOrderTrav(*HeadPtr);
printf("---3---\n");
}
输入二叉树序列为:AB#D##C##
前序遍历运行结果:正确


方法2:节点插入递归完毕后,返回二叉树根节点,用于后续遍历 - 逆向思维
#include <stdio.h>
typedef struct BiTNode
{
char data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode, *BiTree;
/* 按照前序遍历二叉树中节点的值 */
void PreOrderTrav(BiTree T)
{
if(T == NULL)
return;
printf("prev traverse begin:...\n");
/* Step1:打印节点数据 */
printf("%c\n", T->data);
PreOrderTrav((T -> lchild));
printf("prev traverse left:...\n");
PreOrderTrav((T -> rchild));
printf("prev traverse right:...\n");
}
/* 按照前序输入二叉树中节点的值 */
BiTree CreatBiTree()
{
char ch;
BiTree T;
scanf("%c", &ch);
printf("%c\n", ch);
if(ch == '#')
return NULL;
else
{
T = (BiTree)malloc(sizeof(BiTNode));
if(T == NULL)
exit(-1);
printf(" T = %p\n", T);
T->data = ch; /* 生成根节点 */
T->lchild = CreatBiTree( );
T->rchild = CreatBiTree( );
printf("insert op. over!\n");
return T;
}
}
int main()
{
BiTree T = NULL;
BiTree BiTreeHeadPtr = NULL;
printf("---1---\n");
BiTreeHeadPtr = CreatBiTree();
printf(" BiTreeHeadPtr = %p\n", BiTreeHeadPtr);
printf("---2---\n");
PreOrderTrav(BiTreeHeadPtr);
printf("---3---\n");
}
运行结果与方法1一致。
这篇博客介绍了两种方法实现二叉树的前序遍历和构造。第一种方法通过头指针直接指向根节点,然后递归遍历左右子树;第二种方法在递归插入节点后返回根节点,用于后续遍历。代码示例展示了如何创建和遍历二叉树,并给出了输入序列AB#D##C##的正确前序遍历结果。
8204

被折叠的 条评论
为什么被折叠?



