浅谈二叉树的遍历

二叉树分为三种遍历方式:
    --这里说的序是针对根节点的。
1.先序遍历:根——左——右
2.中序遍历:左——根——右
3.后序遍历:左——右——根

//作为  kai1.h 头文件
#include<stdio.h>//输入输出流
#include<stdlib.h>//标准库
 typedef struct node  
 {
  char data;
   struct node *lchild;
   struct node *rchild;
 }*bitree,bitnode;
//构造一个新的二叉树
bitree initbitree(bitnode *root)
{ 
  bitree tree=root;
   return tree;
}
//生成节点包含数据域和左右孩子
bitnode *makenode(char item, bitnode *lchild,bitnode *rchild)
{
bitnode *pnode=(bitnode*)malloc(sizeof(bitnode));
if(pnode)
{
  pnode->data=item;
  pnode->lchild=lchild;
  pnode->rchild=rchild;
}
return pnode;
}
//释放节点
void freenode(bitnode *pnode)
{
  if(pnode!=NULL)
   free(pnode);
 }
//销毁二叉树
void destorybitnode(bitree tree)
{

bitnode *pnode=tree;
if(pnode->lchild!=NULL)
   {
    destorybitnode(pnode->lchild);
	}
if(pnode->rchild!=NULL)
    {
	destorybitnode(pnode->rchild);//递归调用
	}
 freenode(pnode);
}
//判断是否为空
int isempty(bitree tree)
{
      if(tree==NULL)
        return 0;
          else 
	        return 1;
}
//返回树的深度
 int GetDepth(bitree tree)
 {
   int cd,ld,rd;
   cd=ld=rd=0;
   if(tree)
    {
	   ld=GetDepth(tree->lchild);
	   rd=GetDepth(tree->rchild);
	   cd=(ld>rd?ld:rd);
	   return cd+1; 
	 }
      else
	  { 
	   return 0;
       }
 }
 //返回根
 bitree get(bitree tree)
 {
 return tree;
  }
//返回节点值
int getint(bitnode *pnode)
{
    return pnode->data;
}
//设置节点值
void setint(bitnode *pnode, int item)
{
pnode->data=item;
}
//设置左子树
bitree setlchild(bitree parent,bitree lchild)
{
parent->lchild=lchild;
return lchild;
}
//设置右子树
bitree setrchild(bitree parent,bitree rchild)
{
parent->rchild=rchild;
return rchild;
}
//返回左子树
bitree getlchild(bitree tree)
{
 if(tree!=NULL)
   return tree->lchild;
    else
	return NULL;
   
   }

//返回右子树
bitree getrchild(bitree tree)
{
 if(tree!=NULL)
   return tree->rchild;
    else
	return NULL;
   
   }
//插入新的子树,lr为0插入左子树,为1插入右子树
bitree insertchild(bitree parent,int lr,bitree child)
{
  if(parent)
  {
     if(lr==0&&parent->lchild==NULL)
	{
	 parent->lchild=child;
       return child;
	}
	if(lr==1&&parent->rchild==NULL)
	{
	 parent->rchild=child;
       return child;
	}
  }
}
//删除子树lr为0删除左子树,为1删除右子树
void deletechild(bitree parent,int lr)
{
    if(parent)
	{
        if(lr=0 && parent->lchild!=NULL)
		{
	     parent->lchild=NULL;
         freenode(parent->lchild);//释放空间
		}
	  if(lr=1 && parent->rchild!=NULL)
	  {
	   parent->rchild=NULL;
       free(parent->rchild);
	  }
	}
}


#include"kai1.h"
void  preordertravers(bitnode *root)
{
  if(root)
  {
	  printf("%c ",root->data);
      preordertravers(root->lchild);
      preordertravers(root->rchild);
  }
}
//中序遍历
void  inordertravers(bitnode *root)
{
  if(root)
  {   inordertravers(root->lchild);
	  printf("%c ",root->data);
      inordertravers(root->rchild);
  }
}
//后序遍历
void  postordertravers(bitnode *root)
{
  if(root)
  {   
	  postordertravers(root->lchild);
      postordertravers(root->rchild);
	  printf("%c ",root->data);
      
  }
}
int main()
{
bitnode *G=makenode('G',NULL,NULL);
bitnode *H=makenode('H',NULL,NULL);
bitnode *I=makenode('I',NULL,NULL);
bitnode *J=makenode('J',NULL,NULL);
bitnode *D=makenode('D',NULL,G);
bitnode *E=makenode('E',H,I);
bitnode *F=makenode('F',NULL,J);
bitnode *B=makenode('B',D,E);
bitnode *C=makenode('C',F,NULL);
bitnode *A=makenode('A',B,C);
printf("先序遍历:");
preordertravers(A);//A是根节点
printf("\n");
printf("中序遍历:");
inordertravers(A);//A是根节点
printf("\n");
printf("后序遍历:");
postordertravers(A);//A是根节点
printf("\n");
return 0;
}



你可能感兴趣的:(浅谈二叉树的遍历)