二叉树的构造和遍历——递归实现

一、二叉树的定义:

  二叉树是每个结点最多有两个子树的有序树。二叉树常被用于实现二叉查找树。值得注意的是,二叉树不是树的特殊情形。在图论中,二叉树是一个连通的无环图,并且每一个顶点的度不大于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 }

完毕。

时间: 2024-10-22 10:13:37

二叉树的构造和遍历——递归实现的相关文章

二叉树的先序遍历(递归方式)详解

/* * 时间:2015年5月4日09:58:21 * 目的:实现二叉树的先序遍历递归. * 总结和思考!二叉树一般使用链式存储结构 * 如果使用顺序存储方式,除非二叉树是完全二叉树或者满二叉树 * 否则会浪费很多内存空间! */ # include <stdio.h> typedef struct Node{ char data; //数据元素 Node *LChild; //左孩子节点 Node *RChild; //右孩子节点 }BTree; /*递归算法--先序遍历*/ //二叉树的创

二叉树的构造_遍历_求数高和求节点数

1 //手工构造一颗二叉树 ,并给出递归和非递归2类7种遍历方法,树高,节点数求法和逆时针90度显示二叉树 2 //注意本文中2个 typename的使用层次 3 //递归遍历容易溢栈 4 #include <cstdlib> 5 #include <iostream> 6 #include <queue> //用到队列时需要包含此文件 7 #include <stack> //用到栈时需要包含此文件 8 9 using namespace std; 10

二叉树的构造与遍历(前序、中序、后序)

注意: 构造二叉树的时候要用双重指针,用单重指针时,要有返回值. 代码如下: /* 此处输入空格代表空,默认按前序遍历完全二叉树的方式输入数据 形参是在执行函数时自动分配的,没有执行这个函数之前不占用存 储空间,当函数执行完毕后释放这个形参,所以我们要使用到双重指 针来构造树.这样,我们传进去的是树节点的指针的指针,这样函数 执行完成后即使这个“指针的指针“被释放掉了,我们通过*T保存的树 结点的数据还是可以通过树节点的指针T来调用.相反,如果我们传 进去如果是树结点的指针,当这个函数执行完毕后

二叉树的构造与遍历

1 #include <iostream> 2 using namespace std; 3 4 typedef struct node 5 { 6 char data; 7 struct node *lchild; 8 struct node *rchild; 9 }BiTreeNode,*BiTree; 10 11 void createBiTree(BiTree &T) 12 { 13 char c; 14 cin>>c; 15 if(c=='#') T=NULL;

数据结构之二叉树 (构造 拷贝构造 以及前序中序后续三种遍历方法)

首先二叉树的节点定义如下: struct BinaryNode {                  BinaryNode *_left;                  BinaryNode *_right;                  T _data;                 BinaryNode( T data ) :_data(data), _left( NULL), _right(NULL )                 {}; }; 二叉树的结构以及接口如下 te

二叉树三种遍历递归及非递归实现(Java)

import java.util.Stack; //二叉树三种遍历递归及非递归实现(Java) public class Traverse { /******************定义二叉树**************************/ private final int MAX_SIZE = 10; //链式存储 public static class BinaryTreeNode { int mValue; BinaryTreeNode mLeft; BinaryTreeNode

(源码,具体的细节请查阅相关资料)哈弗曼树的构造以及非递归遍历树

写了一点haffman树的创建和二叉树的非递归遍历. 如果编写代码的时候出现了,思维断点,可以借鉴一下, 避免浪费一些不必要的时间. 我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占 位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我 是占位符我是占位符我是占位符我是占位符我是占位符我是 占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符我是占位符

Java数据结构系列之——树(4):二叉树的中序遍历的递归与非递归实现

package tree.binarytree; import java.util.Stack; /** * 二叉树的中序遍历:递归与非递归实现 * * @author wl * */ public class BiTreeInOrder { // 中序遍历的递归实现 public static void biTreeInOrderByRecursion(BiTreeNode root) { if (root == null) { return; } biTreeInOrderByRecursi

二叉树遍历递归与非递归实现

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 二叉树遍历是二叉树中非常基础的部分,也是学习二叉树必须熟练掌握的部分,下面我们先给出二叉树三种遍历方式的定义,并通过举例来说明二叉树遍历的过程. 二叉树的遍历分为:前序遍历(也叫先序遍历).中序遍历.后序遍历.所谓前.中.后都是根据当前子树根结点相对左右孩子的位置而言,也就是说: 前序遍历:根结点在前,即:根 ----->左------->右: 中序遍历:根结点在中间,即:左------>根------>右: 后序遍历:根结点在最