#include <iostream>
#include <stack>
#include <queue>
using namespace std;
typedef char ElemType;
typedef struct BinTreeNode {
ElemType value;
BinTreeNode *left;
BinTreeNode *right;
BinTreeNode(ElemType val) : value(val), left(NULL), right(NULL) {}
}BinTreeNode, *BinTree;
int CreateBinTree(BinTree *pRoot) {
ElemType val;
//按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树
scanf("%c", &val);
if(val == '#') {
*pRoot = NULL;
} else {
*pRoot = (BinTreeNode *)malloc(sizeof(BinTreeNode));
//生成根结点
(*pRoot)->value = val;
//构造左子树
CreateBinTree(&((*pRoot)->left));
//构造右子树
CreateBinTree(&((*pRoot)->right));
}
return 0;
}
void VisitBinTreeNode(BinTreeNode *pNode) {
if (pNode != NULL)
printf("%c ", pNode->value);
}
void PreOrderTraverse(BinTree pRoot) {
if (pRoot == NULL)
return;
VisitBinTreeNode(pRoot);
PreOrderTraverse(pRoot->left);
PreOrderTraverse(pRoot->right);
}
void InOrderTraverse(BinTree pRoot) {
if (pRoot == NULL)
return;
InOrderTraverse(pRoot->left);
VisitBinTreeNode(pRoot);
InOrderTraverse(pRoot->right);
}
void PostOrderTraverse(BinTree pRoot) {
if (pRoot == NULL)
return;
PostOrderTraverse(pRoot->left);
PostOrderTraverse(pRoot->right);
VisitBinTreeNode(pRoot);
}
void PreOrderTraverse2(BinTree pRoot) {
stack<BinTreeNode *> btnStack;
BinTreeNode *p = pRoot;
while (p != NULL || !btnStack.empty()) {
if (p != NULL) {
VisitBinTreeNode(p);
btnStack.push(p);
p = p->left;
} else {
p = btnStack.top();
btnStack.pop();
p = p->right;
}
}
}
void InOrderTraverse2(BinTree pRoot) {
stack<BinTreeNode *> btnStack;
BinTreeNode *p = pRoot;
while (p != NULL || !btnStack.empty()) {
while (p != NULL) {
btnStack.push(p);
p = p->left;
}
p = btnStack.top();
btnStack.pop();
VisitBinTreeNode(p);
p = p->right;
}
}
void PostOrderTraverse2(BinTree pRoot) {
stack<BinTreeNode *> btnStack;
BinTreeNode *p = pRoot;
BinTreeNode *pRight;
while (p != NULL || !btnStack.empty()) {
while (p != NULL) {
btnStack.push(p);
pRight = p->right;
p = p->left;
if (p == NULL) //左子树为空,换右子树
p = pRight;
}
p = btnStack.top(); //栈顶为根,访问
btnStack.pop();
VisitBinTreeNode(p);
if (!btnStack.empty() && btnStack.top()->left == p) { //从左子树退回来
p = btnStack.top()->right; //继续遍历右子树
} else { //从右子树退回来
p = NULL; //回到父节点
}
}
}
void LevelOrderTraverse(BinTree pRoot) {
if (pRoot == NULL)
return;
queue<BinTreeNode *> btnQueue;
btnQueue.push(pRoot);
while (!btnQueue.empty()) {
BinTreeNode *p = btnQueue.front();
btnQueue.pop();
VisitBinTreeNode(p);
if (p->left != NULL) {
btnQueue.push(p->left);
}
if (p->right != NULL) {
btnQueue.push(p->right);
}
}
}
int main()
{
BinTree btree;
CreateBinTree(&btree);
printf("先序遍历:\n");
PreOrderTraverse(btree);
printf("\n");
printf("先序遍历(非递归):\n");
PreOrderTraverse2(btree);
printf("\n");
printf("中序遍历:\n");
InOrderTraverse(btree);
printf("\n");
printf("中序遍历(非递归):\n");
InOrderTraverse2(btree);
printf("\n");
printf("后序遍历:\n");
PostOrderTraverse(btree);
printf("\n");
printf("后序遍历(非递归):\n");
PostOrderTraverse2(btree);
printf("\n");
printf("层次遍历:\n");
LevelOrderTraverse(btree);
printf("\n");
return 0;
}二叉树的遍历
最新推荐文章于 2024-10-21 08:57:50 发布
2250

被折叠的 条评论
为什么被折叠?



