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

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

    完毕。

  • 相关阅读:
    从输入url到浏览器加载过程(回答此问题的一个主干脉络)
    如何减少回流,重绘
    mac常用启动各种服务的命令
    分布式笔记搬迁
    JAVA基础
    EasyExcel引入
    mac 好用软件地址存储
    2018/4/11
    2018/04/04
    jdk各版本
  • 原文地址:https://www.cnblogs.com/xfxu/p/4099501.html
Copyright © 2011-2022 走看看