数据结构——树(6)——树的遍历C++代码

这篇博文,主要验证上篇的树的遍历。再多的理论解释都不如来一个实例实际。现在就拿一个实例来测试这次的遍历。假设我们有这样的一棵树:
这里写图片描述
我们要用不同的方式去遍历。那么我们首先要做的就是,先建立一个个节点,然后再进行连接成树。代码如下:

#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的方法,在建立大型树的时候根本不太可能,那么怎么办呢?下一篇再说。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值