二叉树三种遍历的非递归实现

Posted TangguTae

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树三种遍历的非递归实现相关的知识,希望对你有一定的参考价值。

二叉树的三种遍历前、中、后采用递归的方式实现起来会很简单,非递归值得一做。

递归的实现见:二叉树需要掌握的基本知识_TangguTae的博客-CSDN博客

前序遍历

非递归去实现遍历其思想就是去模拟递归的逻辑,要借助额外的数据结构去实现非递归。

vector<int> preorderTraversal(TreeNode* root) 
	//非递归实现二叉树的前序遍历
	if (root == nullptr)
		return ;
	vector<int> res;
	stack<TreeNode*> st;//借助栈来实现
	TreeNode* cur = root;
	while (cur || !st.empty())
	
		while (cur != nullptr)//先一直找左
		
			res.push_back(cur->val);//把根节点的值push进去
			st.push(cur);
			cur = cur->left;
		
		cur = st.top();
		st.pop();
		cur = cur->right;//然后找右
	
	return res;

中序遍历

思路和前序遍历相同

vector<int> inorderTraversal(TreeNode* root) 
	//非递归实现中序遍历
	//本质上是模拟递归的逻辑
	if (root == nullptr)
		return ;
	stack<TreeNode*> st;
	TreeNode* cur = root;
	vector<int> res;
	while (cur || !st.empty())
	
		while (cur != nullptr)
		
			st.push(cur);
			cur = cur->left;
		
		cur = st.top();
		st.pop();
		res.push_back(cur->val);//遍历完左之后再push根节点
		cur = cur->right;
	
	return res;

后序遍历

后序遍历的过程稍微麻烦一点,因为是最后遍历根,所以需要判断根节点是否是第一次访问,如果是说明还需要遍历他的右孩子,如果不是说明左孩子和右孩子都已经遍历过了。

vector<int> postorderTraversal(TreeNode* root) 
	if (root == nullptr)
		return ;
	stack<pair<TreeNode*, bool>> st;//额外增加一个bool标志位
	TreeNode* cur = root;
	vector<int> res;
	while (cur || !st.empty())
	
		while (cur != nullptr)//前面的逻辑还是一样
		
			st.push( cur,false );
			cur = cur->left;
		
		pair<TreeNode*, bool>& p = st.top();
		if (p.second == false)//如果是第一次遍历,继续查看右孩子
		
			p.second = true;
			cur = p.first->right;
		
		else//不是第一次遍历则直接把根节点push进去
		
			res.push_back(p.first->val);
			st.pop();
		
	
	return res;

以上是关于二叉树三种遍历的非递归实现的主要内容,如果未能解决你的问题,请参考以下文章

二叉树三种遍历(先序,中序,后序)----超详细

二叉树三种遍历(先序,中序,后序)----超详细

二叉树三种深度遍历方法和实现

二叉树几种遍历算法的非递归实现

二叉树遍历

遍历二叉树