#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include "zhan.h"
typedef struct _BiNode
{
char data;
struct BiNode* lchild;
struct BiNode* rchild;
}BiNode;
//#号发法创建二叉树
BiNode* CreateTree()
{
char ch="";
fflush(stdin);
scanf("%c",&ch);
if(ch=='#')
{
return NULL;
}
BiNode* left = CreateTree();
BiNode* right = CreateTree();
BiNode* node = (BiNode*)malloc(sizeof(BiNode));
node->lchild = left;
node->rchild = right;
node->data = ch;
return node;
}
//销毁二叉树
void DesTree(BiNode * node)
{
if(node==NULL)
{
return ;
}
DesTree(node->lchild);
DesTree(node->rchild);
free(node);
}
//递归遍历二叉树
void ResTree(BiNode* node)
{
if(node==NULL)
{
return NULL;
}
printf("%c",node->data);
ResTree(node->lchild);
ResTree(node->rchild);
printf("\n");
}
//非递归遍历二叉树
void DeResTree(BiNode* node)
{
if(node==NULL)
{
return NULL;
}
BiNode* child = node;
SeqStack* zhan = init();
while(length(child)>0||child)
{
while(child)
{
//打印指针内容
printf("%c\n",child->data);
//入栈
push(zhan,node);
//向下找指针
child = child->lchild;
}
while(length(child)>0)
{
BiNode* node = top(zhan);
pop(zhan);
node = node->rchild;
}
}
}
//二叉树叶子节点
void NumTree_Tree(BiNode* tr,int* num)
{
if(tr==NULL)
{
return;
}
if(tr->lchild==NULL||tr->rchild==NULL)
{
(*num)++;
}
NumTree_Tree(tr->lchild,num);
NumTree_Tree(tr->rchild,num);
}
//求二叉树深度
int DeepTree(BiNode* tr)
{
if(tr==NULL)
{
return 0 ;
}
int deep = 0;
int left = DeepTree(tr->lchild);
int right = DeepTree(tr->rchild);
if(left>right)
{
deep = left+1;
}else
{
deep = right+1;
}
return deep;
}
//释放二叉树
void free_tree(BiNode* tr)
{
if(tr==NULL)
{
return;
}
free_tree(tr->lchild);
free_tree(tr->rchild);
printf("您已经释放%c\n",tr->data);
free(tr);
}
int main(void)
{
//创建二叉树
BiNode* show = CreateTree();
//递归遍历
ResTree(show);
//非递归遍历
DeResTree(show);
int f= 0;
int *num = &f;
//求二叉树子节点数量
NumTree_Tree(show,num);
printf("num = %d\n",*num);
//求二叉树深度
int deep = DeepTree(show);
printf("deep = %d\n",deep);
//释放二叉树
free_tree(show);
printf("----------------------\n");
return 0;
}