二叉树遍历 递归与非递归 先序-中序-后序

题目:

分别用递归和非递归的方式实现二叉树先序、中序、后序遍历!

二叉树节点结构

struct TreeNode{
	int val;
	TreeNode *left;
	TreeNode *right;

	TreeNode(int v) :val(v), left(NULL), right(NULL){}
};

先序遍历

递归实现

/*递归先序遍历*/
void preOrderRecur(TreeNode *tree)
{
	if (!tree)
		return;

	cout << tree->val << "\t";
	preOrderRecur(tree->left);
	preOrderRecur(tree->right);
}

非递归实现

/*非递归实现先序遍历*/
void preOrderUnRecur(TreeNode *tree)
{
	if (!tree)
		return;

	stack<TreeNode *> stk;
	/*压入根节点*/
	stk.push(tree);
	while (!stk.empty())
	{
		TreeNode *tmp = stk.top();
		cout << tmp->val << "\t";
		stk.pop();

		/*先压入栈右子树节点,再压入栈左子树节点*/
		if (tmp->right)
			stk.push(tmp->right);
		if (tmp->left)
			stk.push(tmp->left);
	}//while
}

中序遍历

递归实现

/*递归实现中序遍历*/
void inOrderRecur(TreeNode *tree)
{
	if (!tree)
		return;

	inOrderRecur(tree->left);
	cout << tree->val << "\t";
	inOrderRecur(tree->right);
}

非递归实现

/*非递归实现中序遍历*/
void inOrderUnRecur(TreeNode *tree)
{
	if (!tree)
		return;

	stack<TreeNode *> stk;
	TreeNode *cur = tree;
	while (!stk.empty() || cur)
	{
		if (cur)
		{
			stk.push(cur);
			cur = cur->left;
		}//if
		else{
			cur = stk.top();
			stk.pop();
			cout << cur->val << "\t";
			cur = cur->right;
		}//else
	}//while
}

后序遍历

递归实现

/*递归实现后序遍历*/
void postOrderRecur(TreeNode *tree)
{
	if (!tree)
		return;

	postOrderRecur(tree->left);
	postOrderRecur(tree->right);
	cout << tree->val << "\t";
}

非递归实现1

/*非递归实现后序遍历1*/
void postOrderRecur1(TreeNode *tree)
{
	if (!tree)
		return;

	/*两个辅助栈*/
	stack<TreeNode *> stk1;
	stack<TreeNode *> stk2;

	stk1.push(tree);
	while (!stk1.empty())
	{
		TreeNode *tmp = stk1.top();
		stk1.pop();
		if (tmp->left)
			stk1.push(tmp->left);
		if (tmp->right)
			stk1.push(tmp->right);

		stk2.push(tmp);
	}//while

	while (!stk2.empty())
	{
		cout << stk2.top()->val << "\t";
		stk2.pop();
	}//while
}

非递归实现方式2

/*非递归实现后序遍历2*/
void postOrderRecur2(TreeNode *h)
{
	if (!h)
		return;

	/*实现过程中,h代表最近一次弹出并打印的节点*/
	stack<TreeNode *> stk;
	stk.push(h);
	TreeNode *tmp;
	while (!stk.empty())
	{
		/*tmp代表栈顶节点*/
		tmp = stk.top();
		if (tmp->left && h != tmp->left && h != tmp->right)
		{
			stk.push(tmp->left);
		}//else
		else if (tmp->right && h != tmp->right)
		{
			stk.push(tmp->right);
		}//elif
		else
		{
			cout << tmp->val << "\t";
			stk.pop();
			h = tmp;
		}//else
	}//while
}

完整程序GitHub网址








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值