zoukankan      html  css  js  c++  java
  • 二叉树的构造和遍历——递归实现

    一、二叉树的定义:

      二叉树是每个结点最多有两个子树的有序树。二叉树常被用于实现二叉查找树。值得注意的是,二叉树不是树的特殊情形。在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于2。有根二叉树还要满足根结点的度不大于2。有了根结点后,每个顶点定义了唯一的根结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。

    二、二叉树与树的区别:

      二叉树不是树的一种特殊情形,尽管其与树有许多相似之处,但树和二 叉树有两个主要差别:

    1. 树中结点的最大度数没有限制,而二叉树结点的最大度数为2;

    2. 树的结点无左、右之分,而二叉树的结点有左、右之分。

    三、二叉树的遍历;
      二叉树的遍历分为先序遍历、中序遍历和后序遍历二叉树三种。
    “遍历”是二叉树各种操作的基础,可以再遍历的过程中对结点进行各种操作,例如求结点的双亲、求结点的孩子结点、求二叉树的深度等操作都是建立在二叉树遍历的基础上,因此必须掌握二叉树的各种遍历过程,并能灵活运用一解决各种问题。
    四、二叉树的构造和递归遍历实现代码如下
    前序遍历:按照“根结点——左孩子——右孩子”的顺序访问;
    中序遍历:按照“左孩子——根结点——右孩子“的顺序访问;
    后序遍历:按照“左孩子——根结点——右孩子”的顺序访问。
     1 #include <iostream>
     2 #include <string>
     3 #include <assert.h>
     4 #include <stdlib.h>
     5 #include <time.h>
     6 using namespace std;
     7 const int N =10;
     8 
     9 typedef struct node //二叉树的数据结构
    10 {
    11     int data_;
    12     struct node* left_;
    13     struct node* right_;
    14 }BTree, *pBTree;
    15 
    16 void  Create_Btree_with_arr(pBTree &T, int *arr, int begin, int end)//len俄日数组的长度,也是树的结点数
    17 {
    18     if(begin > end)
    19         return;
    20 
    21     int mid = (begin + end)/2;
    22     if( T == NULL)
    23     {
    24         T =(pBTree)malloc(sizeof(BTree)); //申请空间
    25         arr[mid] = rand()%100;
    26         cout<< arr[mid] <<" ";
    27         T->data_ = arr[mid]; //数值随机化
    28         T->left_ = NULL;
    29         T->right_ = NULL;
    30     }
    31     Create_Btree_with_arr(T->left_, arr, begin, mid-1);//左边(不包括T)
    32     Create_Btree_with_arr(T->right_, arr, mid+1, end); //右边(不包括T)
    33 }
    34 
    35 void Pre_Traversal(pBTree T) //前序遍历
    36 {
    37     if( T != NULL)
    38     {
    39         cout << T->data_ <<" ";
    40         Pre_Traversal( T->left_);
    41         Pre_Traversal( T->right_);
    42     }
    43 }
    44 
    45 void InOrder_Traversal( pBTree T)//中序遍历
    46 {
    47     if( T == NULL)
    48         return;
    49     InOrder_Traversal(T->left_);
    50     cout << T->data_ <<" ";
    51     InOrder_Traversal(T->right_);
    52 }
    53 
    54 void PostOrder_Traversal( pBTree T) //后续遍历 '
    55 {
    56 
    57     if( T != NULL)
    58     {
    59         PostOrder_Traversal( T->left_);
    60         PostOrder_Traversal( T->right_);
    61         cout << T->data_ <<" ";
    62     }    
    63 }
    64 
    65 void DestructBTree( pBTree &T) //二叉树的销毁
    66 {
    67     if( T == NULL)
    68         return;
    69 
    70     DestructBTree( T->left_);
    71     DestructBTree( T->right_);
    72     free(T); //free之后的指针成为了野指针,内容并不为空
    73     T = NULL;//置空
    74 }
    75 
    76 int main(int argc, char const *argv[])
    77 {
    78     srand(time(NULL));
    79     int arr[N]= {0};
    80 
    81     pBTree T =NULL;
    82     Create_Btree_with_arr(T, arr, 0,N-1);
    83     cout << endl;
    84 
    85     Pre_Traversal(T);
    86     cout << endl;
    87 
    88     InOrder_Traversal(T);
    89     cout << endl;
    90 
    91     PostOrder_Traversal(T);
    92     cout << endl;
    93 
    94     DestructBTree(T);
    95     cout <<"Free Over" << endl;
    96     assert( T == NULL); //验证 T 是否真的被释放
    97     return 0;
    98 }
    View Code

    二叉树的非递归遍历二叉树的非递归遍历

    完毕。

  • 相关阅读:
    帝国 标签模板 使用程序代码 去除html标记 并 截取字符串
    iis6 伪静态 iis配置方法 【图解】
    您来自的链接不存在 帝国CMS
    帝国cms Warning: Cannot modify header information headers already sent by...错误【解决方法】
    .fr域名注册 51元注册.fr域名
    帝国网站管理系统 恢复栏目目录 建立目录不成功!请检查目录权限 Godaddy Windows 主机
    星外虚拟主机管理平台 开通数据库 出现Microsoft OLE DB Provider for SQL Server 错误 '8004' 从字符串向 datetime 转换失败
    ASP.NET 自定义控件学习研究
    CSS层叠样式表之CSS解析机制的优先级
    ASP.NET程序员工作面试网络收藏夹
  • 原文地址:https://www.cnblogs.com/xfxu/p/4099501.html
Copyright © 2011-2022 走看看