#include <iostream> |
002 | #include <stack> |
003 | #include <queue> |
004 | |
005 | using
namespace std; |
006 | |
007 | typedef
struct Node{ |
008 | int
data; |
009 | Node *left;
|
010 | Node *right;
|
011 | int
tag; |
012 | Node( int
val):data(val),left(NULL),right(NULL),tag(0){} |
013 | }Node; |
014 | |
015 | //插入二叉树节点--递归实现 |
016 | Node *InsertTree(Node *root, int
val) |
017 | { |
018 | Node *e = NULL;
|
019 | if (root == NULL){
|
020 | e =
new Node(val);
|
021 | if (e == NULL)
return NULL;
|
022 | return
e; |
023 | } else {
|
024 | if (val < root->data){
|
025 | root->left = InsertTree(root->left,val); //创建左子树
|
026 | }
|
027 | else
if (val > root->data){
|
028 | root->right = InsertTree(root->right,val); //创建右子树
|
029 | }
|
030 | }
|
031 | return
root; //递归函数返回时返回的根节点
|
032 | } |
033 | |
034 | |
035 | //在二叉树中插入节点--非递归实现 |
036 | void
InsertTree_(Node **root, int
val) |
037 | { |
038 | if (root == NULL)
return ;
|
039 | Node *e =
new Node(val);
|
040 | if (e == NULL)
return ;
|
041 | if (*root == NULL){
|
042 | *root = e;
|
043 | } else {
|
044 | Node *p = *root,*pre = NULL;
|
045 | while (p != NULL){
|
046 | pre = p;
|
047 | if (e->data < p->data){
|
048 | p = p->left;
|
049 | }
|
050 | else
if (e->data > p->data){
|
051 | p = p->right;
|
052 | } else { //有相同的元素就退出
|
053 | delete
e; |
054 | return ;
|
055 | }
|
056 | }
|
057 | |
058 | if (e->data < pre->data){
|
059 | pre->left = e;
|
060 | } else {
|
061 | pre->right = e;
|
062 | }
|
063 | }
|
064 | } |
065 | |
066 | //销毁二叉树 |
067 | void
DeleteTree(Node *root) |
068 | { |
069 | if (root != NULL){
|
070 | if (root->left != NULL){
|
071 | DeleteTree(root->left);
|
072 | }
|
073 | if (root->right != NULL){
|
074 | DeleteTree(root->right);
|
075 | }
|
076 | cout<< "delete :" <<root->data<<endl;
|
077 | delete
root; |
078 | }
|
079 | } |
080 | |
081 | //递归先序遍历二叉树 |
082 | void
PreOrder(Node *root) |
083 | { |
084 | if (root != NULL){
|
085 | cout<< root->data << " " ;
|
086 | PreOrder(root->left);
|
087 | PreOrder(root->right);
|
088 | }
|
089 | } |
090 | |
091 | //递归中序遍历二叉树 |
092 | void
MidOrder(Node *root) |
093 | { |
094 | if (root != NULL){
|
095 | MidOrder(root->left);
|
096 | cout<<root->data<< " " ;
|
097 | MidOrder(root->right);
|
098 | }
|
099 | } |
100 | |
101 | //递归后续遍历二叉树 |
102 | void
LastOrder(Node *root) |
103 | { |
104 | if (root != NULL){
|
105 | LastOrder(root->left);
|
106 | LastOrder(root->right);
|
107 | cout<<root->data<< " " ;
|
108 | }
|
109 | } |
110 | |
111 | //非递归先序遍历 |
112 | void
PreOrder_(Node *root) |
113 | { |
114 | if (root == NULL)
return ;
|
115 | Node *p = root;
|
116 | stack<Node *> s;
|
117 | while (!s.empty() || p != NULL)
|
118 | {
|
119 | while ( p != NULL){
|
120 | cout<<p->data << " " ;
|
121 | s.push(p);
|
122 | p = p->left;
|
123 | }
|
124 | |
125 | if (!s.empty()){
|
126 | p = s.top();
|
127 | s.pop();
|
128 | p = p->right;
|
129 | }
|
130 | }
|
131 | cout<<endl;
|
132 | } |
133 | |
134 | //非递归中序遍历 |
135 | void
MidOrder_(Node *root) |
136 | { |
137 | if (root == NULL)
return ;
|
138 | stack<Node *> s;
|
139 | Node *p = root;
|
140 | while (!s.empty()|| p != NULL)
|
141 | {
|
142 | //将左子树压入栈中
|
143 | while (p != NULL){
|
144 | |
145 | s.push(p);
|
146 | p = p->left;
|
147 | }
|
148 | //当栈不为空时弹出左子树,输出左子树的值再遍历右子树
|
149 | if (!s.empty())
|
150 | {
|
151 | p = s.top();
|
152 | cout<<p->data<< " " ;
|
153 | s.pop();
|
154 | p = p->right;
//将右子树压入栈中 |
155 | }
|
156 | }
|
157 | cout<<endl;
|
158 | } |
159 | |
160 | //非递归后续遍历 |
161 | //需要判断根结点的左右子树是否都遍历过了 |
162 | void
LastOrder_(Node *root) |
163 | { |
164 | if (root == NULL)
return ;
|
165 | stack<Node *> s;
|
166 | Node *p = root;
|
167 | while (!s.empty() || p != NULL)
|
168 | {
|
169 | while (p != NULL){
|
170 | s.push(p);
|
171 | p = p->left;
|
172 | }
|
173 | |
174 | if (!s.empty())
|
175 | {
|
176 | p = s.top(); //弹出左子树
|
177 | //如果左子树已经遍历
|
178 | if (p->tag == 1)
|
179 | {
|
180 | cout<<p->data<< " " ;
|
181 | s.pop();
|
182 | p = NULL;
//为了弹出p的父结点 |
183 | } else {
|
184 | p->tag = 1;
|
185 | p = p->right;
|
186 | }
|
187 | }
|
188 | }
|
189 | cout<<endl;
|
190 | } |
191 | |
192 | //广度优先遍历二叉树 |
193 | void
LevelOrder(Node *root) |
194 | { |
195 | if (root == NULL) return ;
|
196 | queue<Node *> queue;
|
197 | Node *p = NULL;
|
198 | //根结点入队
|
199 | queue.push(root);
|
200 | while (!queue.empty())
|
201 | {
|
202 | p = queue.front();
//取出队首元素 |
203 | cout<<p->data<< " " ;
|
204 | queue.pop();
|
205 | if (p->left != NULL)
|
206 | queue.push(p->left);
|
207 | if (p->right != NULL)
|
208 | queue.push(p->right);
|
209 | }
|
210 | cout<<endl;
|
211 | } |
212 | |
213 | //判断是否为二叉排序树,通过中序遍历,中序遍历的输出结果是从小到大排列的,
|
214 | //从跟节点开始记录每次弹出的数,如果比后一个弹出的数大,说明不是二叉排序树
|
215 | //是返回1,不是返回 0,错误 返回 -1 |
216 | |
217 | int
IsSortedTree(Node *root) |
218 | { |
219 | if (root == NULL)
return -1;
|
220 | Node *p = root;
|
221 | stack<Node *> s;
|
222 | int
pre_data = 0; |
223 | while (!s.empty() || p != NULL)
|
224 | {
|
225 | while (p != NULL){
|
226 | s.push(p);
|
227 | p = p->left;
|
228 | }
|
229 | if (!s.empty())
|
230 | {
|
231 | p = s.top();
|
232 | if (pre_data == 0 || pre_data < p->data)
|
233 | {
|
234 | pre_data = p->data;
|
235 | }
|
236 | if (pre_data > p->data){
|
237 | return
0; |
238 | }
|
239 | s.pop();
|
240 | p = p->right;
|
241 | }
|
242 | }
|
243 | return
1; |
244 | } |
245 | |
246 | int
main() |
247 | { |
248 | /*
|
249 | Node *root = NULL;
|
250 | int arr[] = {8,2,5,1,7,9,3,6,0,4};
|
251 | int len = sizeof(arr)/sizeof(int);
|
252 | for(int i = 0; i < len;i++){
|
253 | //root = InsertTree(root,arr[i]);
|
254 | InsertTree_(&root,arr[i]);
|
255 | }
|
256 | */ |
257 | |
258 | Node *root = NULL;
|
259 | Node* a =
new Node(1);
|
260 | Node* b =
new Node(2);
|
261 | Node* c =
new Node(3);
|
262 | root = a;
|
263 | a->left = b;
|
264 | a->right = c;
|
265 | |
266 | cout<< "pre order :" ;
|
267 | PreOrder(root);
|
268 | cout<<endl;
|
269 | cout<< "\t " ;
|
270 | PreOrder_(root);
|
271 | |
272 | cout<< "mid order :" ;
|
273 | MidOrder(root);
|
274 | cout<<endl;
|
275 | cout<< "\t " ;
|
276 | MidOrder_(root);
|
277 | |
278 | cout<< "last order :" ;
|
279 | LastOrder(root);
|
280 | cout<<endl;
|
281 | |
282 | cout<< "\t " ;
|
283 | LastOrder_(root);
|
284 | |
285 | cout<< "Level Order:" ;
|
286 | LevelOrder(root);
|
287 | |
288 | int
ret = IsSortedTree(root); |
289 | if (ret == 1){
|
290 | cout<< "Is BST" <<endl;
|
291 | } else {
|
292 | cout<< "Is NOT BST" <<endl;
|
293 | }
|
294 | DeleteTree(root);
|
295 | |
296 | |
297 |
return 0;
|
298 | } |