二叉树的链表建立和遍历

一般的树可以通过“父子-堂兄弟”关系转变为二叉树,如下图所示


二叉树的链表建立和遍历_第1张图片

然后再旋转45度即可变为二叉树(真的好聪明2333)

二叉树的链表建立和遍历_第2张图片

下面看一下二叉树的名片

类型名称:二叉树

数据对象集:一个有穷的结点集合

若不为空,则由根节点和其左、右二叉子树组成


操作集:BT∈BinTree,Item∈ElementType,重要操作有:

1、Boolean IsEmpty(BinTree BT):判断FT是否为空

2、void Traversal(BinTree BT):遍历,按某顺序访问每个结点

3、BinTree CreateBinTree():创建一个二叉树


常用的遍历方法有三种

二叉树的链表建立和遍历_第3张图片


树的建立有下面两种代码的实现方式

 Ptree createTree()   //树的建立
 {  
     char ch;  
     Ptree t;  
     ch=getchar();  //输入二叉树数据
     if(ch==' ')  //判断二叉树是否为空
         t=NULL;  
     else 
     {  
         t=(Ptree)malloc(sizeof(Ptree));  //二叉树的生成
         t->data=ch;  
         t->lchild=createTree();  
         t->rchild=createTree();  
     }  
     return t;  
 }  
 

void createBiTree(BiTree &T)  
{  
    char c;  
    scanf("%c",&c); 
    if('#' == c)  
        T = NULL;  
    else  
    {  
        T = new BiTreeNode;  
        T->data = c;  
        createBiTree(T->leftChild);  
        createBiTree(T->rightChild);  
    }  
}  
都是依照前序遍历的方法做递归得到的结果


假设二叉树为:

                                       a

                              b                 c

                                   d                 e

       

         因为程序中要知道叶子结点(终点),所以要将上面的二叉树变成扩展二叉树 (把叶子结点的孩子补成#, 用作标记),  扩展后就变成了:         

                                       a

                            b                    c

                       #        d          #       e

                              #    #             #    #

 

          那么,在输入的时候,需要输入: ab#d##C#e##   



遍历的方法有前序遍历、中序遍历和后序遍历三种

#include "stdio.h"  
#include "stdlib.h"    
typedef struct tree
{  
    char data;  
    struct tree *lchild;  
    struct tree *rchild;  
 }*Ptree; 

 Ptree createTree()   //树的建立
 {  
     char ch;  
     Ptree t;  
     ch=getchar();  //输入二叉树数据
     if(ch==' ')  //判断二叉树是否为空
         t=NULL;  
     else 
     {  
         t=(Ptree)malloc(sizeof(Ptree));  //二叉树的生成
         t->data=ch;  
         t->lchild=createTree();  
         t->rchild=createTree();  
     }  
     return t;  
 }  
 
 void preOrder(Ptree t)  //先序遍历 
 {  
     if(t)  
     {    
         printf("%c",t->data);  
         preOrder(t->lchild);  
         preOrder(t->rchild);  
     }  
 }  
 
 void intOrder(Ptree t)  //中序遍历  
{  
    if(t)  
     {  
        intOrder(t->lchild);  
        printf("%c",t->data);  
        intOrder(t->rchild);  
     }  
 }  
 
 void postOrder(Ptree t)  //后序遍历  
 {  
     if(t)  
     {     
         postOrder(t->lchild);  
         postOrder(t->rchild); 
	     printf("%c",t->data);  
     }  
 }  


void main()  
{   
   Ptree t; 
   printf("先序创建二叉树,用空格代表虚结点:\n");
   t=createTree(); 
   printf("前序遍历:");
   preOrder(t) ;
   printf("\n");
   printf("中序遍历:");
   intOrder(t);
   printf("\n");
   printf("后序遍历:");  
   postOrder(t);  
   printf("\n"); 
   system("pause");
}
输入上面的例子、执行效果是如下图

二叉树的链表建立和遍历_第4张图片

其执行原理是

二叉树的链表建立和遍历_第5张图片


下一章博客将讲述怎样把递归的转化为非递归的

你可能感兴趣的:(Data,Structure)