二叉树的基本操作,最基本的初始化销毁清空树

论坛 期权论坛 期权     
匿名   2018-4-26 13:44   5217   1
用二叉树的顺序存储实现:1.InitBiTree(&T)
2.DestroyBiTree(&T)
3.CreateBiTree(&T,definition)
4.ClearBiTree(&T)
5.BiTreeEmpty(T)
哪位大神可以给出全部实现代码,谢谢
分享到 :
0 人收藏

1 个回复

倒序浏览
2#
cn#apuafGuGGk  4级常客 | 2018-4-30 02:08:14 发帖IP地址来自

//聽创建二叉树,请输入节点的总数量:聽7
//聽请连续输入7个节点的数据:聽4聽2聽6聽1聽3聽5聽7
//聽前序遍历序列:聽4聽2聽1聽3聽6聽5聽7
//聽中序遍历序列:聽1聽2聽3聽4聽5聽6聽7
//聽后序遍历序列:聽1聽3聽2聽5聽7聽6聽4
//聽二叉树的节点一共有7个,度为1的节点有0个,度为2的节点有3个,
//聽叶子节点有4个,数据值的最大值是7,最小值是1
//
//聽对应的二叉树:
//
//聽聽聽聽聽聽聽4
//聽聽聽聽/聽聽聽聽聽聽\
//聽聽聽2聽聽聽聽聽聽聽聽6
//聽聽/聽聽\聽聽聽聽聽/聽聽\
//聽1聽聽聽聽3聽聽聽5聽聽聽聽7

#include聽"stdio.h"
#include聽"stdlib.h"
struct聽Tree
{
聽聽聽聽int聽data;
聽聽聽聽struct聽Tree聽*left;
聽聽聽聽struct聽Tree聽*right;
};
typedef聽struct聽Tree聽TreeNode;
typedef聽TreeNode聽*Bitree;

typedef聽struct聽stack_node聽//栈的结构体
{
聽聽聽聽Bitree聽bt;
struct聽stack_node聽*next;
}聽stack_list,聽*stack_link;

Bitree聽insertNode(Bitree聽root,int聽data)聽//插入结点
{
聽聽聽聽Bitree聽newnode;
聽聽聽聽Bitree聽current;
聽聽聽聽Bitree聽back;
聽聽聽聽newnode=(Bitree)malloc(sizeof(TreeNode));
聽聽聽聽if(newnode==NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽printf("\n动态分配内存出错.\n");
聽聽聽聽聽聽聽聽exit(1);
聽聽聽聽}
聽聽聽聽newnode->data=data;
聽聽聽聽newnode->left=NULL;
聽聽聽聽newnode->right=NULL;
聽聽聽聽if(root==NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽return聽newnode;
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽聽聽聽current=root;
聽聽聽聽聽聽聽聽while(current!=NULL)
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽back=current;
聽聽聽聽聽聽聽聽聽聽聽聽if(current->data聽>聽data)
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽current=current->left;
聽聽聽聽聽聽聽聽聽聽聽聽else
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽current=current->right;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽if(back->data聽>聽data)
聽聽聽聽聽聽聽聽聽聽聽聽back->left=newnode;
聽聽聽聽聽聽聽聽else
聽聽聽聽聽聽聽聽聽聽聽聽back->right=newnode;
聽聽聽聽}
聽聽聽聽return聽root;
}

Bitree聽createTree()聽//创建二叉树(非递归)
{
聽聽聽聽Bitree聽root=NULL;
聽聽聽聽int聽len;
聽聽聽聽int聽data;
聽聽聽聽int聽i;
聽聽聽聽printf("创建二叉树,请输入节点的总数量:聽");
聽聽聽聽scanf("%d",&len);
聽聽聽聽printf("请连续输入%d个节点的数据:聽",len);
聽聽聽聽for(i=0;idata);
聽聽聽聽聽聽聽聽preOrder(ptr->left);
聽聽聽聽聽聽聽聽preOrder(ptr->right);
聽聽聽聽}
}

void聽inOrder(Bitree聽ptr)聽//中序遍历(递归法)
{
聽聽聽聽if(ptr!=NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽inOrder(ptr->left);
聽聽聽聽聽聽聽聽printf("%d聽",ptr->data);
聽聽聽聽聽聽聽聽inOrder(ptr->right);
聽聽聽聽}
}

void聽postOrder(Bitree聽ptr)聽//后序遍历(递归法)
{
聽聽聽聽if(ptr!=NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽postOrder(ptr->left);
聽聽聽聽聽聽聽聽postOrder(ptr->right);
聽聽聽聽聽聽聽聽printf("%d聽",ptr->data);
聽聽聽聽}
}

//检查[栈]是否是空
int聽isEmpty(stack_link聽stack)
{
if(stack聽==聽NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽return聽1;
聽聽聽聽}
聽聽聽聽else
聽聽聽聽{
聽聽聽聽聽聽聽聽return聽0;
聽聽聽聽}
}

//入栈
stack_link聽push(stack_link聽stack,Bitree聽bt)
{
stack_link聽new_node;

new_node=(stack_link)malloc(sizeof(stack_list));
if(!new_node)
{
  return聽NULL;
}
new_node->bt=bt;
new_node->next=stack;
stack=new_node;
return聽stack;
}

//出栈
stack_link聽pop(stack_link聽stack,Bitree聽*bt)
{
stack_link聽top;

if(isEmpty(stack))
{
  *bt聽=聽NULL;
  return聽NULL;
}
top=stack;
*bt=top->bt;
stack=top->next;
free(top);
return聽stack;
}
//统计节点(非递归)
void聽reportByStack(Bitree聽bt,int聽*pTotal,int聽*pCount0,int聽*pCount1,
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽int聽*pCount2,int聽*pMaxValue,int聽*pMinValue)
{
聽聽聽聽Bitree聽p=NULL;
聽聽聽聽stack_link聽oneStack=NULL;
聽聽聽聽int聽total=0;
聽聽聽聽int聽count0=0,count1=0,count2=0;
聽聽聽聽int聽maxValue=0,minValue=0;

聽聽聽聽if(bt聽==聽NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽return;
聽聽聽聽}

聽聽聽聽p=bt;聽聽聽聽聽聽聽聽聽聽//当前二叉树的节点
聽聽聽聽minValue=p->data;
聽聽聽聽maxValue=minValue;
聽聽聽聽while(p聽!=聽NULL)
聽聽聽聽{
聽聽聽聽聽聽聽聽if(minValue聽>聽p->data)
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽minValue聽=聽p->data;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽if(maxValue聽data)
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽maxValue聽=聽p->data;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽total++;聽//total=count0+count1+count2
聽聽聽聽聽聽聽聽if(p->right聽==聽NULL聽&&聽p->left聽==聽NULL)聽//叶子
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽count0++;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽else聽if(p->right聽!=聽NULL聽&&聽p->left聽!=聽NULL)聽//度2
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽count2++;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽else聽//度1
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽count1++;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽if(p->right聽!=聽NULL)聽聽//如果有右子树,马上入栈
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽oneStack=push(oneStack,p->right);
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽if(p->left聽!=聽NULL)聽//如果有左子树,设为当前节点
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽p=p->left;
聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽else
聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽oneStack=pop(oneStack,&p);
聽聽聽聽聽聽聽聽聽聽聽if(p聽==聽NULL)
聽聽聽聽聽聽聽聽聽聽聽{
聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽break;
聽聽聽聽聽聽聽聽聽聽聽}
聽聽聽聽聽聽聽聽}
聽聽聽聽}
聽聽聽聽*pTotal=total;
聽聽聽聽*pCount0=count0;
聽聽聽聽*pCount1=count1;
聽聽聽聽*pCount2=count2;
聽聽聽聽*pMaxValue=maxValue;
聽聽聽聽*pMinValue=minValue;
}

int聽main()
{
聽聽聽聽Bitree聽root=NULL;
聽聽聽聽int聽total=0;
聽聽聽聽int聽count0=0,count1=0,count2=0;
聽聽聽聽int聽maxValue=0,minValue=0;

聽聽聽聽root=createTree();聽//创建二叉树

聽聽聽聽printf("\n前序遍历序列:聽");
聽聽聽聽preOrder(root);
聽聽聽聽printf("\n中序遍历序列:聽");
聽聽聽聽inOrder(root);
聽聽聽聽printf("\n后序遍历序列:聽");
聽聽聽聽postOrder(root);

聽聽聽聽//统计节点(非递归)
聽聽聽聽reportByStack(root,&total,&count0,&count1,&count2,&maxValue,&minValue);
聽聽聽聽printf("\n二叉树的节点一共有%d个,度为1的节点有%d个,度为2的节点有%d个,\n",
聽聽聽聽聽聽聽聽聽聽聽total,count1,count2);
聽聽聽聽printf("叶子节点有%d个,数据值的最大值是%d,最小值是%d",
聽聽聽聽聽聽聽聽聽聽聽count0,maxValue,minValue);

聽聽聽聽printf("\n");
聽聽聽聽return聽0;
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:58388
帖子:6688
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP