数据结构-遍历二叉树的基本操作
InitTreeNode(BiTree &T)
CreateBiTree(BiTree& T)
Visit(BiTree T)
PreOrder(BiTree T)
InOrder(BiTree T)
PostOrder(BiTree T)
LevelOrderQueue(BiTree T) 队列实现层次遍历
LevelOrderRecursion(BiTree T) 递归实现层次遍历
#include <iostream>
#include<queue>
using namespace std;
#define ElemType int
//binary tree二叉树
typedef struct BiTNode {
ElemType data;
BiTNode* lchild, * rchild;
}BiTNode, * BiTree;
//递归初始化结点,时间复杂度O(n)
bool InitTreeNode(BiTree& T) {
ElemType e;
scanf("%d", &e);
if (e == -1) {
T = NULL;
}
else {
T = new BiTNode;
T->data = e;
InitTreeNode(T->lchild);
InitTreeNode(T->rchild);
}
return true;
}
//初始化二叉树,时间复杂度O(1)
bool CreateBiTree(BiTree& T) {
printf("请按照先序遍历输入树结点数据(空格隔开,节点输入-1):");
InitTreeNode(T);
printf("初始化完成!\n");
return true;
}
//访问结点数据,时间复杂度O(1)
bool Visit(BiTree T) {
printf("%d ", T->data);
return true;
}
//前序遍历,时间复杂度O(n)
bool PreOrder(BiTree T) {
if (T != NULL) {
Visit(T);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
return true;
}
//中序遍历,时间复杂度O(n)
bool InOrder(BiTree T) {
if (T != NULL) {
InOrder(T->lchild);
Visit(T);
InOrder(T->rchild);
}
return true;
}
//后序遍历,时间复杂度O(n)
bool PostOrder(BiTree T) {
if (T != NULL) {
PostOrder(T->lchild);
PostOrder(T->rchild);
Visit(T);
}
return true;
}
/*队列实现层次遍历
* 实现思路:父亲入队,左右儿子存在则入队,访问队头的父亲,然后弹出队头父亲
*/
bool LevelOrderQueue(BiTree T) {
if (T != NULL) {
queue<BiTNode> q; //C++STL泛型编程容器,队列容器
q.push(*T);//首先根结点入队
while (!q.empty())//队列非空
{
BiTNode temp = q.front();
if (temp.lchild != NULL) { //队列先进先出,先入左孩子
q.push(*temp.lchild);
}
if (temp.rchild != NULL) { //队列先进先出,后入右孩子
q.push(*temp.rchild);
}
q.pop(); //父节点出队
printf("%d ", temp.data);
}
}
return true;
}
/*我的想法
* 递归实现层次遍历
* 实现思路:根节点只访问一次,左右孩子结点先访问,再递归访问孩子的孩子,就是一层一层访问,使用递归
*/
bool flag = true;
bool LevelOrderRecursion(BiTree T) {
if (T == NULL) {
return false;
}
if (T != NULL && flag == true) { //只访问一次,用于访问根节点,不然递归会重复访问左右孩子结点
printf("%d ", T->data);
flag = false;
}
if (T->lchild != NULL) { //访问左孩子
printf("%d ", T->lchild->data);
}
if (T->rchild != NULL) { //访问右孩子
printf("%d ", T->rchild->data);
}
LevelOrderRecursion(T->lchild); //递归访问
LevelOrderRecursion(T->rchild); //递归访问
return true;
}
void meue() {
printf("------------操作菜单------------\n");
printf("1.构造树 2.先序遍历\n");
printf("3.中序遍历 4.后序遍历\n");
printf("5.层次遍历(队列) 6.层次遍历(递归)\n");
printf("--------------------------------\n");
printf("请输入菜单序号(0退出):");
}
int main() {
BiTree T; int choice;
T = NULL; //没有初始化,直接用递归遍历会报错
while (true) {
meue();
scanf("%d", &choice);
switch (choice)
{
case 1:CreateBiTree(T); break;
case 2:printf(">先序遍历:"); PreOrder(T); printf("\n"); break;
case 3:printf(">中序遍历:"); InOrder(T); printf("\n"); break;
case 4:printf(">后序遍历:"); PostOrder(T); printf("\n"); break;
case 5:printf(">层次遍历(队列):"); LevelOrderQueue(T); printf("\n"); break;
case 6:printf(">层次遍历(递归):"); LevelOrderRecursion(T); printf("\n"); flag = true; break;
case 0:return 0;
default:
printf("菜单位序输入错误!\n");
}
}
}
/*实现例子
1 2 3 -1 -1 -1 4 5 -1 6 -1 -1 7 -1 -1
1 2 4 -1 -1 5 -1 -1 3 6 -1 -1 7 -1 -1
*/
case one
case two