二叉树的链表建立和遍历

Posted 拉风小宇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树的链表建立和遍历相关的知识,希望对你有一定的参考价值。

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



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


下面看一下二叉树的名片

类型名称:二叉树

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

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


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

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

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

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


常用的遍历方法有三种



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

 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");

输入上面的例子、执行效果是如下图


其执行原理是



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

以上是关于二叉树的链表建立和遍历的主要内容,如果未能解决你的问题,请参考以下文章

二叉树的遍历与建立

数据结构二叉树

二叉树有关习题整理145二叉树的后序遍历 94二叉树的中序遍历 572另一棵树的子树 236二叉树的最近公共祖先 JZ36二叉搜索树与双向链表 - 牛客

Python 二叉树的创建和遍历、重建

二叉树的遍历

二叉树的后续遍历是啥意思啊?