C++:二叉树后序遍历的非递归

文章目录

  • 题目

题目

C++:二叉树后序遍历的非递归_第1张图片

  • 力扣:145. 二叉树的后序遍历

  1. 树节点的栈;根节点入栈,最后访问跟;往左走,根节点入栈,左子树走到空…
  2. 栈顶元素的右子树若存在,往右走,根节点入栈;若左右都为空,就可以访问根元素,然后栈顶元素出栈;
  3. 若左右不为空,重复1,2
  4. 再取栈顶元素,因为入栈的都是左根节点,看右边有没有…重复2,直至栈为空。
    C++:二叉树后序遍历的非递归_第2张图片
  • 出栈代表此根所在的子树已经访问完毕,不需要再入栈;因此需要判断当前栈顶根的右子树是不是上一个栈顶根元素。

Show Me The Code:

  • 树节点
#include 
#include 
#include 
using namespace std;

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

	TreeNode() : val(0), left(nullptr), right(nullptr) {}
	TreeNode(int x)
		: val(x), 
		left(nullptr),
		right(nullptr)
	{}
	TreeNode(int x, TreeNode* left, TreeNode* right) 
		: val(x)
		, left(left)
		, right(right) 
	{}
};
  • 解决方案:
class Solution
{
public:
	vector<int> postorderTraversal(TreeNode* root)
	{
		stack<TreeNode*> st;
		TreeNode* prev = nullptr;
		TreeNode* cur = root;
		vector<int> v;

		//左子树,右子树,根
		while (cur || !st.empty())
		{
			//左边的统统入栈
			while (cur)
			{
				st.push(cur);
				cur = cur->left;
			}
			//取栈顶的右子树访问
			TreeNode* top = st.top();
			//如果右子树也为空,且它的右边已经访问过了,就可以访问这个节点了
			if (top->right==nullptr||top->right==prev)
			{
				v.push_back(top->val);
				st.pop();
				prev = top;
			}
			else
			{
				cur = top->right;//往右边走。
			}
		}
		return v;//返回..
	}
};
  • 测试代码:
void Test()
{
		TreeNode* node1 = new TreeNode(1);
		TreeNode* node2 = new TreeNode(2);
		TreeNode* node3 = new TreeNode(3);
		TreeNode* node4 = new TreeNode(4);
		TreeNode* node5 = new TreeNode(5);
		TreeNode* node6 = new TreeNode(6);
			node1->left = node4;
			node1->right = node2;
			node4->left = node5;
			node5->right = node6;
			node2->left = node3;
			vector<int> v = Solution().postorderTraversal(node1);
			for (auto& i : v)
			{
				cout << i << " ";
			}
			cout <<endl;
}

你可能感兴趣的:(Drill,Hub,c++,开发语言,c语言,青少年编程,算法)