二叉树的前中后序遍历

递归方式:

// 前序遍历
void PreorderTraversal(Node *root) {
	if (root == NULL) {
		// 空树
		return;
	}

	printf("%d ", root->val);		// 根
	PreorderTraversal(root->left);	// 前序遍历左子树
	PreorderTraversal(root->right);	// 前序遍历右子树
}

// 中序遍历
void InorderTraversal(Node *root) {
	if (root == NULL) {
		return;
	}

	InorderTraversal(root->left);
	printf("%d ", root->val);
	InorderTraversal(root->right);
}

// 后序遍历
void PostorderTraversal(Node *root) {
	// 终止条件
	if (root == NULL) {
		return;
	}

	// 递推的过程
	PostorderTraversal(root->left);
	PostorderTraversal(root->right);
	printf("%d ", root->val);
}

非递归:

#include <stack>
// 前序遍历非递归
void PreorderTraversalNoR(Node *root) {
	stack<Node *>	s;	// 栈
	Node *cur = root;
	Node *top = NULL;

	while (cur != NULL || !s.empty()) {
		// 一路向左的过程
		while (cur != NULL) {
			printf("%c ", cur->val);
			s.push(cur);
			cur = cur->left;
		}

		// 一定是向左遇到 NULL
		// 利用栈处理剩余的右子树
		top = s.top();	s.pop();
		//top = StackTop(&s); StackPop(&s);

		cur = top->right;
	}
}

void InorderTraversalNoR(Node *root) {
	stack<Node *>	s;	// 栈
	Node *cur = root;
	Node *top = NULL;

	while (cur != NULL || !s.empty()) {
		// 一路向左的过程
		while (cur != NULL) {
			// 第一次遇到的结点的位置
			s.push(cur);
			cur = cur->left;
		}

		// 一定是向左遇到 NULL
		// 利用栈处理剩余的右子树
		top = s.top();	s.pop();
		//top = StackTop(&s); StackPop(&s);
		// 第二次遇到的地方
		printf("%c ", top->val);

		cur = top->right;
	}
}


void PostorderTraversalNoR(Node *root) {
	stack<Node *>	s;	// 栈
	Node *cur = root;
	Node *top = NULL;
	Node *last = NULL;

	while (cur != NULL || !s.empty()) {
		// 一路向左的过程
		while (cur != NULL) {
			// 第一次遇到的结点的位置
			s.push(cur);
			cur = cur->left;
		}

		// 一定是向左遇到 NULL
		// 利用栈处理剩余的右子树
		top = s.top();
		if (top->right == NULL) {
			printf("%c ", top->val);
			s.pop();
			last = top;
		}
		else if (top->right == last) {
			printf("%c ", top->val);
			s.pop();
			last = top;
		}
		else {
			cur = top->right;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值