#include <stdio.h>
#include <malloc.h>
/*
* 先中后序遍历 都由递归来完成,
递归的原理是栈的调用
(可手算推导过程,因为程序写起来很简单,所以更多的还是要理解和熟悉)
*/
/*struct ElemType//用来存放自定义数据的结构体
{
int value;
};*/
typedef struct BitNode
{
int data;
struct BitNode* lchild;
struct BitNode* rchild;
}BitNode, * BiTree;
//初始化根结点
BiTree Init_BiTree(BiTree& root, int e)
{
root->data =e;
root->lchild = NULL;
root->rchild = NULL;
printf("\n以%d为根节点的二叉树初始化根节点成功!", e);
return root;
}
//给二叉树中的某个结点插入左孩子
BitNode* insert_BitNode_lchild(BitNode*& Tnode)
{
int e;
int flag = 1;//该插入的左孩子默认为NULL
BitNode* child = (BitNode*)malloc(sizeof(BitNode));
//child = NULL;//该插入的左孩子默认为NULL
printf("\n若该结点 %d 左孩子为NULL--1,若该结点 %d 左孩子为准确的结点(有意义)--2:",Tnode->data, Tnode->data);
scanf_s("%d", &flag);
if (flag == 2)
{
printf("\n请输入该结点的值(int):");
scanf_s("%d", &e);
//初始化新增结点
child->data = e;
child->lchild = NULL;
child->rchild = NULL;
printf("\n新增一个(左)结点:%d", child->data);
}
else
{
child = NULL;
}
//将新增的结点child与二叉树中的一个结点Tnode 链接起来
Tnode->lchild = child;
return child;
}
//给二叉树中的某个结点插入右孩子
BitNode* insert_BitNode_rchild(BitNode*& Tnode)
{
int e;
int flag = 1;//该插入的右孩子默认为NULL
BitNode* child = (BitNode*)malloc(sizeof(BitNode));
//child = NULL;//该插入的左孩子默认为NULL
printf("\n若该结点 %d 右孩子为NULL--1,若该结点 %d 右孩子为准确的结点(有意义)--2:", Tnode->data, Tnode->data);
scanf_s("%d", &flag);
if (flag == 2)
{
printf("\n请输入该结点的值(int):");
scanf_s("%d", &e);
//初始化新增结点
child->data = e;
child->lchild = NULL;
child->rchild = NULL;
printf("\n新增一个(左)结点:%d", child->data);
}
else
{
child = NULL;
}
//将新增的结点child与二叉树中的一个结点Tnode 链接起来
Tnode->rchild = child;
return child;
}
//输出嘛
void visit(BitNode* node)
{
printf(" %d ",node->data);
}
//先序遍历二叉树(根左右)
void Pre_ER(BiTree T)
{
if (T!=NULL)
{
visit(T);//根
Pre_ER(T->lchild);//左
Pre_ER(T->rchild);//右
}
}
//中序遍历二叉树(左根右)
void In_ER(BiTree T)
{
if (T!=NULL)
{
In_ER(T->lchild);
visit(T);
In_ER(T->rchild);
}
}
//后序遍历二叉树(左右根)
void Post_ER(BiTree T)
{
if (T != NULL)
{
Post_ER(T->lchild);
Post_ER(T->rchild);
visit(T);
}
}
//递归法实现二叉树的递归插入(创造出一个初始的完整的二叉树)-- 已手算验证过,嘿嘿嘿 ^>^
BitNode* insert_node(BitNode* N)
{
if (N != NULL)//如果该结点不是空
{
insert_BitNode_lchild(N);//为该节点添加左孩子
insert_node(N->lchild);//为该节点的左孩子添加左孩子或右孩子
insert_BitNode_rchild(N);//为该节点添加右孩子
insert_node(N->rchild);//为该节点的右孩子添加左孩子或右孩子
}
return N;
}
void test()
{
int e;
BiTree root=(BitNode* )malloc(sizeof(BitNode));
printf("\n\n开始创造一个二叉树:\n\n请输入树根结点的值(int):");
scanf_s("%d", &e);
Init_BiTree(root, e);//二叉树树根,一颗二叉树的唯一标识
printf("\n根节点的值:%d",root->data);
root = insert_node(root);//二叉树的枝叶
printf("\n先序遍历:\n");
Pre_ER(root);
printf("\n中序遍历:\n");
In_ER(root);
printf("\n后序遍历:\n");
Post_ER(root);
printf("\n\n先序中序后序遍历完成!!\n");
}
int main()
{
test();
return 0;
}
重点是要理解递归是怎么利用栈来实现递归实现的!