方法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一致。