/*2018年8月19日 16:55:56*/
/*构建一个二叉树函数*/
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
typedef char DataType;
typedef struct tree{
DataType data;
struct tree *left;
struct tree *right;
}TreeNode;
/*二叉树初始化函数*/
void TreeInit(TreeNode **root)
{
if ((*root=(TreeNode *)malloc(sizeof(TreeNode)))==NULL)
{
printf("-error-");
getchar();
exit(1);
}
(*root)->left = NULL;
(*root)->right = NULL;
}
/*二叉树左子节点插入*/
int *TreeLeftNode(TreeNode *pLeft, DataType x)
{
TreeNode *pre, *temp;
if (pLeft==NULL)
{
return NULL;
}
temp = pLeft->left; //保存原节点的左子树指针
pre = (TreeNode*)malloc(sizeof(TreeNode));//开辟pre的内存空间
pre->data = x; //将数字插入节点数据储存中
pre->left = temp;//将原树的左子树指针赋值给新节点的左子树指针
pre->right = NULL; //将新节点右子树设为空;
pLeft->left = pre; //新节点成为左子树;
return pLeft->left; //2018年8月19日 21:03:12 返回左子树指针
}
/*二叉树右子节点插入*/
int *TreeRightNode(TreeNode *pRight, DataType x)
{
TreeNode *pre, *temp;
if (pRight == NULL)
{
return NULL;
}
temp = pRight->right;
pre = (TreeNode*)malloc(sizeof(TreeNode));//开辟pre的内存空间
pre->data = x;
pre->right = temp;
pre->left = NULL;
pRight->right = pre;
return pRight->right; //2018年8月19日 21:02:49 返回右子树指针
}
/*二叉树左子节点删除*/
int *TreeLeftDel(TreeNode *dLeft)
{
if (dLeft==NULL||dLeft->left==NULL)
{
return NULL;
}
free(dLeft->left);
dLeft->left = NULL;
return dLeft;
}
/*二叉树右子节点删除*/
int *TreeRightDel(TreeNode *dright)
{
if (dright==NULL||dright->right==NULL)
{
return NULL;
}
free(dright->right);
dright->right = NULL;
return dright;
}
/*递归撤销链表的函数*/
void Destroy(TreeNode **tree)
{
if ((*tree) != NULL && (*tree)->left != NULL)
{
Destroy(&(*tree)->left);
}
if ((*tree) != NULL && (*tree)->right != NULL)
{
Destroy(&(*tree)->right);
}
free(*tree);
}
/*通过递归实现遍历*/
void Visit(DataType item)
{
printf("%c->",item);
}
/*前序遍历*/
void FrontOrder(TreeNode *tree, void Visit(DataType item))
{
if (tree!=NULL)
{
Visit(tree->data);
FrontOrder(tree->left, Visit);
FrontOrder(tree->right, Visit);
}
}
/*中序遍历*/
void BetweenOrder(TreeNode *tree, void Visit(DataType item))
{
if (tree!=NULL)
{
BetweenOrder(tree->left, Visit);
Visit(tree->data);
BetweenOrder(tree->right, Visit);
}
}
/*后续遍历*/
void LastOrder(TreeNode *tree, void Visit(DataType item))
{
if (tree != NULL)
{
BetweenOrder(tree->left, Visit);
BetweenOrder(tree->right, Visit);
Visit(tree->data);
}
}
/*打印函数*/
void PrintBiTree(TreeNode *tree, int num) //其中num是层数
{
int i;
if (tree==NULL)
{
return;
}
PrintBiTree(tree->right, num + 1);
/*访问根节点*/
for ( i = 0; i < num-1; i++)
{
printf(" ");
}
if (num>0)
{
printf("----");
printf("%c\n", tree->data);
}
PrintBiTree(tree->left, num + 1);
}
/*二叉树查找函数*/
TreeNode *Serach(TreeNode *tree, DataType x)
{
TreeNode *pre;
if (tree==NULL)
{
return NULL;
}
if (tree->data==x)
{
return tree;
}
if (tree->left!=NULL)
{
pre=Serach(tree->left, x);
if (pre!=NULL)
{
return pre;
}
}
if (tree->right != NULL)
{
pre=Serach(tree->right, x);
if (pre != NULL)
{
return pre;
}
}
return NULL;
}
/*主函数*/
int main()
{
TreeNode *root,*p,*pp;
TreeInit(&root);
p = TreeLeftNode(root, 'A');
p = TreeLeftNode(p, 'B');
p = TreeLeftNode(p, 'D');
p = TreeRightNode(p, 'G');
p = TreeRightNode(root->left, 'C');
pp = p;
TreeLeftNode(p, 'E');
TreeRightNode(pp, 'F');
PrintBiTree(root, 0);
printf("前序遍历:\n");
FrontOrder(root->left, Visit);
printf("\n中序遍历:\n");
BetweenOrder(root->left, Visit);
printf("\n后序遍历:\n");
LastOrder(root->left, Visit);
Destroy(&root); //2018年8月19日 20:40:34 注意这里输出型
printf("\n");
system("pause");
return 0;
}