数据结构二叉树

二叉树的定义:二叉树是每个结点最多有两个子树的有序树。

下面的代码内容主要包括二叉树的建立,判断二叉树是否为空树,二叉树的先序遍历,中序遍历,后序遍历以及层次遍历,计算总结点个数,叶子节点个数,树的深度。

先序遍历(根左右):先访问一个节点的根,再访问其左子树,接着右子树,通过递归的方法。

中序遍历(左根右),后序遍历(左右根)的原理与先序相同,只是访问顺序不同。

在数据结构中,想要确定唯一的一棵二叉树,需要一棵树的中序序列以及另外两个序列中的任意一个,所以想要只用一个序列建立出一棵二叉树,就必须要用特殊符号来表示空节点。在下面的代码中,我是通过先序序列建立二叉树,空节点用‘#’表示。

另外在提一句,递归是数据结构乃至编程中非常重要的一种操作方法,下面代码的基本上每一个操作都用上了递归,必须要熟悉掌握。

  1 #include<iostream>
  2 #include<algorithm>
  3 #include<queue>
  4 using namespace std;
  5 //***************链式二叉树**************
  6 
  7 //结构定义
  8 typedef struct BiNode{
  9     char data;
 10     struct BiNode *lchild,*rchild;
 11 }BiNode, *BiTree;
 12 
 13 //判断二叉树是否为空树
 14 int EmptyBT(BiTree T)
 15 {
 16     if(T == NULL)
 17         return 1;
 18     return 0;
 19 }
 20  
 21 //先序建立二叉树
 22 void CreateBT(BiTree &T)
 23 {
 24     char child;
 25     cin>>child;
 26     if(child == '#')//无节点 
 27         T = NULL;
 28     else
 29     {
 30         T = new BiNode;
 31         T->data = child;
 32         CreateBT(T->lchild);//建立左子节点 
 33         CreateBT(T->rchild);//建立右子节点 
 34     }
 35 }
 36 
 37 //先序遍历(根左右)
 38 void PreOrder(BiTree &T)
 39 {
 40     if(T == NULL) return;
 41     cout<<T->data<<' ';
 42     if(T->lchild != NULL)
 43         PreOrder(T->lchild);
 44     if(T->rchild != NULL)
 45         PreOrder(T->rchild);
 46     return;
 47 }
 48 
 49 //中序遍历(左根右) 
 50 void InOrder(BiTree &T)
 51 {
 52     if(T == NULL) return;
 53     if(T->lchild != NULL)
 54         InOrder(T->lchild);
 55     cout<<T->data<<' ';    
 56     if(T->rchild != NULL)
 57         InOrder(T->rchild);
 58     return;
 59 }
 60 
 61 //后序遍历(左右根) 
 62 void PostOrder(BiTree &T)
 63 {
 64     if(T ==NULL) return;
 65     if(T->lchild != NULL)
 66         PostOrder(T->lchild);
 67     if(T->rchild != NULL)
 68         PostOrder(T->rchild);
 69     cout<<T->data<<' ';    
 70     return;
 71 }
 72 
 73 //层次遍历二叉树
 74 void LevelOrder(BiTree &T)
 75 {
 76     if(T == NULL) return;
 77     queue<BiTree> q;
 78     BiNode *p = new BiNode; 
 79     q.push(T);
 80     while(!q.empty())
 81     {
 82         p = q.front();
 83         q.pop();
 84         cout<<p->data<<' ';
 85         if(p->lchild != NULL)
 86             q.push(p->lchild);
 87         if(p->rchild != NULL)
 88             q.push(p->rchild);
 89     }
 90 }
 91 
 92 //计算总节点个数
 93 int NodeCount(BiTree T)
 94 {
 95     if(T == NULL) 
 96         return 0;
 97     else 
 98         return NodeCount(T->lchild) + NodeCount(T->rchild) +1;
 99 }
100 
101 //计算叶子节点个数
102 int LeafCount(BiTree T)
103 {
104     if(T == NULL)
105         return 0;
106     if(T->lchild==NULL && T->rchild==NULL)
107         return 1;
108     return LeafCount(T->lchild) + LeafCount(T->rchild);
109 }
110 
111 //计算二叉树的深度
112 int DepthBT(BiTree T)
113 {
114     if(T == NULL)
115         return 0;
116     if(T->lchild==NULL && T->rchild==NULL)
117         return 1;
118     return max(DepthBT(T->lchild)+1 , DepthBT(T->rchild)+1);
119 }
120 
121 //查找二叉树元素
122 int FindBT(BiTree &T,char e)
123 {
124     if(T == NULL)
125         return 0;
126     else if(T->data == e)
127         return 1;
128     else if(FindBT(T->lchild,e) || FindBT(T->rchild,e))
129         return 1;
130     else return 0;
131 }
132 
133 //清除二叉树
134 void ClearBT(BiTree &T)
135 {
136     if(T == NULL)
137         return;
138     ClearBT(T->lchild);
139     ClearBT(T->rchild);
140     delete T;
141 }
142 
143 int main()
144 {
145     BiTree T;
146 
147     cout<<"请输入二叉树的先序序列,空用‘#’表示:"; 
148     CreateBT(T);
149     
150     if(EmptyBT(T))
151         cout<<"二叉树为空树"<<endl;
152     else
153     {
154         //cout<<"二叉树不为空"<<endl;
155     
156         cout<<"先序序列为:";
157         PreOrder(T);
158         cout<<endl;
159         
160         cout<<"中序序列为:";
161         InOrder(T);
162         cout<<endl;
163         
164         cout<<"后序序列为:";
165         PostOrder(T);
166         cout<<endl;
167         
168         cout<<"层次遍历序列为:";
169         LevelOrder(T);
170         cout<<endl; 
171         
172         cout<<"二叉树总节点个数为:"<<NodeCount(T)<<endl;
173         cout<<"二叉树叶子节点个数为:"<<LeafCount(T)<<endl;
174         cout<<"二叉树的深度为:"<<DepthBT(T)<<endl;
175         
176         char a;
177         cout<<"请输入要查找的元素:"; 
178         cin>>a;
179         if(FindBT(T,a))
180             cout<<"存在元素"<<a<<endl;
181         else
182             cout<<"不存在元素"<<a<<endl;
183     }
184     ClearBT(T);
185     return 0;
186 }

毕竟这是为了完成数据结构实验所写的代码,所以写的比较简单,有很多细节情况没有考虑进去,以后有时间会写写更复杂的来练手。

原文地址:https://www.cnblogs.com/tuyang1129/p/9140812.html