二叉树的遍历

#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;   
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值