这篇博文,主要验证上篇的树的遍历。再多的理论解释都不如来一个实例实际。现在就拿一个实例来测试这次的遍历。假设我们有这样的一棵树:
我们要用不同的方式去遍历。那么我们首先要做的就是,先建立一个个节点,然后再进行连接成树。代码如下:
#include <iostream>
#include <string>
#include "Queue.h"
using namespace std;
/*先建立二叉树的结构*/
struct Tree{
string value; //数据
Tree *left; //指向左节点的指针
Tree *right;//指向右节点的指针
};
/*
*再写一个将节点组装成的二叉树
*因为我们是组装成树,所以返回类型肯定是Tree类型
*我们指针指向Tree的根部,接收一个值
*/
Tree *makeTree(string value){
Tree *t = new Tree; //在堆上建立一个Tree类型的数据结构
t -> value = value;
t -> left = NULL;
t -> right = NULL; //这里我一开始写错了,写成left,导致调试了很久,最后找到,非语法错误真的是很致命
return t;
}
/*
*初始化树,将我们图画中的单词按要求插入
*
*/
Tree *initTree(){
Tree * root = new Tree;
root->value = "this";
root->left = makeTree("is");
root->left->left = makeTree("a");
root->left->right = makeTree("correctly");
root->right = makeTree("written");
root->right->right = makeTree("sentence.");
return root;
}
//先序遍历
void preOrder(Tree * tree) {
if(tree == NULL) {
return;
}
cout << tree->value << " ";
preOrder(tree->left);
preOrder(tree->right);
}
//中序遍历
void inOrder(Tree * tree) {
if(tree == NULL) {
return;
}
inOrder(tree->left);
cout << tree->value << " ";
inOrder(tree->right);
}
//后序遍历
void postOrder(Tree * tree) {
if(tree == NULL) {
return;
}
postOrder(tree->left);
postOrder(tree->right);
cout << tree->value << " ";
}
//层次遍历
void levelOrder(Tree *tree) {
Queue<Tree *>treeQueue;
treeQueue.enqueue(tree);
while (!treeQueue.isEmpty()) {
Tree *node = treeQueue.dequeue();
cout << node->value << " ";
if (node->left != NULL) {
treeQueue.enqueue(node->left);
}
if (node->right != NULL) {
treeQueue.enqueue(node->right);
}
}
}
int main() {
Tree * tree = initTree();
cout << "1) Pre-order" << endl;
cout << "2) In-order" << endl;
cout << "3) Post-order (Yoda?)" << endl;
cout << "4) Level-order" << endl << endl;
int choice = -1;
while (choice != 0) {
cout << "请选择 1-4 (0 退出):" ;
cin >> choice;
switch (choice) {
case 1: preOrder(tree); break;
case 2: inOrder(tree); break;
case 3: postOrder(tree); break;
case 4: levelOrder(tree); break;
}
cout << endl << endl;
}
cout << "Goodbye!" << endl;
return 0;
}
太久没写代码了,导致犯了一个超级低级的错误。真的代码久了不写,手生、好了,看看在VS2010下的测试结果:
但是发现没,如果按照makeTree的方法,在建立大型树的时候根本不太可能,那么怎么办呢?下一篇再说。