赞
踩
#include <stdio.h> #include <stdlib.h> typedef char ElementType; typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; BinTree CreatBinTree(); /* 实现细节忽略 */ void InorderTraversal( BinTree BT ); void PreorderTraversal( BinTree BT ); void PostorderTraversal( BinTree BT ); void LevelorderTraversal( BinTree BT ); int main() { BinTree BT = CreatBinTree(); printf("Inorder:"); InorderTraversal(BT); printf("\n"); printf("Preorder:"); PreorderTraversal(BT); printf("\n"); printf("Postorder:"); PostorderTraversal(BT); printf("\n"); printf("Levelorder:"); LevelorderTraversal(BT); printf("\n"); return 0; }
前序遍历,中序遍历和后序遍历用递归可以简单实现
层序遍历可以通过申请一个出队操作的队列实现
下面是代码
void InorderTraversal( BinTree BT ) { if(BT){ if(BT->Left) InorderTraversal(BT->Left); printf(" %c",BT->Data); if(BT->Right) InorderTraversal(BT->Right); } } void PreorderTraversal( BinTree BT ) { if(BT){ printf(" %c",BT->Data); if(BT->Left) PreorderTraversal(BT->Left); if(BT->Right) PreorderTraversal(BT->Right); } } void PostorderTraversal( BinTree BT ) { if(BT){ if(BT->Left) PostorderTraversal(BT->Left); if(BT->Right) PostorderTraversal(BT->Right); printf(" %c",BT->Data); } } void LevelorderTraversal( BinTree BT ) { BinTree a[101]; int i,j; a[0] = BT; i = j = 0; while(BT){ if(BT->Left){ a[++i] = BT->Left; } if(BT->Right){ a[++i] = BT->Right; } printf(" %c",BT->Data); if(i == j){ break; } BT = a[++j]; } }
层序遍历在队列的出栈操作上纠结了很久,想着定义一个队列来解决,但是我发现找不到结束的条件。。。没有整个树结点的个数。后来搜索才发现暴力解决,申请一个足够大不会溢出的数组就行
用两个变量i和j,分别指示队列中新元素插入的位置和新元素的父母结点
整个插入的结束条件就是当i = j时,即最后一个叶子结点
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。