3aa1b38fb6
tree ; you can mtrace a.out 1,txt check memory
214 lines
3.8 KiB
C
214 lines
3.8 KiB
C
/*************************************************************************
|
||
> File Name: binarytree.c
|
||
> Author: jinshaohui
|
||
> Mail: jinshaohui789@163.com
|
||
> Time: 18-11-12
|
||
> Desc:
|
||
************************************************************************/
|
||
#include<assert.h>
|
||
|
||
#include<string.h>
|
||
#include<stdlib.h>
|
||
#include<stdio.h>
|
||
#include"list_queue.h"
|
||
|
||
typedef struct _treenode
|
||
{
|
||
int data;
|
||
struct _treenode *lchild;
|
||
struct _treenode *rchild;
|
||
}Tnode,Tree;
|
||
|
||
void binarytree_create(Tree **Root)
|
||
{
|
||
int a = 0;
|
||
printf("\r\n输入节点数值((当输入为100时,当前节点创建完成))):");
|
||
scanf("%d",&a);
|
||
|
||
|
||
if (a == 100)
|
||
{
|
||
*Root = NULL;
|
||
}
|
||
else
|
||
{
|
||
*Root = (Tnode *)malloc(sizeof(Tnode));
|
||
if (*Root == NULL)
|
||
{
|
||
return;
|
||
}
|
||
|
||
(*Root)->data = a;
|
||
printf("\r\n create %d 的左孩子:",a);
|
||
binarytree_create(&((*Root)->lchild));
|
||
printf("\r\n create %d 的右孩子:",a);
|
||
binarytree_create(&((*Root)->rchild));
|
||
}
|
||
|
||
return ;
|
||
}
|
||
|
||
void binarytree_destory(Tree *root)
|
||
{
|
||
if (root == NULL)
|
||
{
|
||
return;
|
||
}
|
||
|
||
binarytree_destory(root->lchild);
|
||
binarytree_destory(root->rchild);
|
||
free(root);
|
||
}
|
||
|
||
/*先序遍历:根结点--》左子树---》右子树*/
|
||
void binarytree_preorder(Tree *root)
|
||
{
|
||
if (root == NULL)
|
||
{
|
||
return;
|
||
}
|
||
printf(" %d ",root->data);
|
||
binarytree_preorder(root->lchild);
|
||
binarytree_preorder(root->rchild);
|
||
return;
|
||
}
|
||
/*中序遍历:左子树--》跟节点---》右子树*/
|
||
void binarytree_inorder(Tree *root)
|
||
{
|
||
if (root == NULL)
|
||
{
|
||
return;
|
||
}
|
||
binarytree_inorder(root->lchild);
|
||
printf(" %d ",root->data);
|
||
binarytree_inorder(root->rchild);
|
||
return;
|
||
}
|
||
/*后序遍历:左子树---》右子树-》根节点*/
|
||
void binarytree_postorder(Tree *root)
|
||
{
|
||
if (root == NULL)
|
||
{
|
||
return;
|
||
}
|
||
binarytree_postorder(root->lchild);
|
||
binarytree_postorder(root->rchild);
|
||
printf(" %d ",root->data);
|
||
return;
|
||
}
|
||
|
||
void binarytree_levelorder(Tree * root)
|
||
{
|
||
list_queue *queue = NULL;
|
||
Tnode * node = NULL;
|
||
|
||
if(root == NULL)
|
||
{
|
||
return;
|
||
}
|
||
|
||
queue = list_queue_create();
|
||
|
||
/*根节点先入队*/
|
||
list_queue_enqueue(queue,(void *)root);
|
||
|
||
while(!list_queue_is_empty(queue))
|
||
{
|
||
list_queue_dequeue(queue,(void *)&node);
|
||
printf(" %d ",node->data);
|
||
|
||
if(node->lchild != NULL)
|
||
{
|
||
list_queue_enqueue(queue,(void *)node->lchild);
|
||
}
|
||
|
||
if(node->rchild != NULL)
|
||
{
|
||
list_queue_enqueue(queue,(void *)node->rchild);
|
||
}
|
||
}
|
||
|
||
free(queue);
|
||
|
||
}
|
||
/*打印叶子节点*/
|
||
void binarytree_printfleaf(Tree *root)
|
||
{
|
||
if (root == NULL)
|
||
{
|
||
return;
|
||
}
|
||
|
||
if ((root->lchild == NULL) && (root->rchild == NULL))
|
||
{
|
||
printf(" %d ",root->data);
|
||
}
|
||
else
|
||
{
|
||
binarytree_printfleaf(root->lchild);
|
||
binarytree_printfleaf(root->rchild);
|
||
}
|
||
}
|
||
/*打印叶子的个数*/
|
||
int binarytree_getleafnum(Tree*root)
|
||
{
|
||
if (root == NULL)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
if ((root->lchild == NULL) && (root->rchild == NULL))
|
||
{
|
||
return 1;
|
||
}
|
||
|
||
return binarytree_getleafnum(root->lchild) + binarytree_getleafnum(root->rchild);
|
||
|
||
}
|
||
/*打印数的高度*/
|
||
int binarytree_gethigh(Tree *root)
|
||
{
|
||
int lhigh = 0;
|
||
int rhigh = 0;
|
||
|
||
if (root == NULL)
|
||
{
|
||
return 0;
|
||
}
|
||
|
||
lhigh = binarytree_gethigh(root->lchild);
|
||
rhigh = binarytree_gethigh(root->rchild);
|
||
|
||
return ((lhigh > rhigh)?(lhigh + 1):(rhigh + 1));
|
||
}
|
||
|
||
int main()
|
||
{
|
||
Tree *root = NULL;
|
||
|
||
setenv("MALLOC_TRACE","1.txt",1);
|
||
mtrace();
|
||
|
||
printf("\r\n创建二叉树:");
|
||
binarytree_create(&root);
|
||
printf("\r\n先序遍历二叉树:");
|
||
binarytree_preorder(root);
|
||
printf("\r\n中序遍历二叉树:");
|
||
binarytree_inorder(root);
|
||
printf("\r\n后序遍历二叉树:");
|
||
binarytree_postorder(root);
|
||
printf("\r\n层次遍历二叉树:");
|
||
binarytree_levelorder(root);
|
||
|
||
printf("\r\n打印二叉树叶子节点:");
|
||
binarytree_printfleaf(root);
|
||
printf("\r\n打印二叉树叶子节点个数:%d",binarytree_getleafnum(root));
|
||
printf("\r\n打印二叉树高度:%d",binarytree_gethigh(root));
|
||
|
||
binarytree_destory(root);
|
||
|
||
muntrace();
|
||
return 0;
|
||
}
|
||
|