栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 题目
  • 答
  • GG

题目

  • 力扣:145. 二叉树的后序遍历
答
  1. 树节点的栈;根节点入栈,最后访问跟;往左走,根节点入栈,左子树走到空…
  2. 栈顶元素的右子树若存在,往右走,根节点入栈;若左右都为空,就可以访问根元素,然后栈顶元素出栈;
  3. 若左右不为空,重复1,2
  4. 再取栈顶元素,因为入栈的都是左根节点,看右边有没有…重复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 postorderTraversal(TreeNode* root)
	{
		stack st;
		TreeNode* prev = nullptr;
		TreeNode* cur = root;
		vector 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 v = Solution().postorderTraversal(node1);
			for (auto& i : v)
			{
				cout << i << " ";
			}
			cout < 
GG 

都说面对对象编程,那没有对象的我,则是在面向百度编程…

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1012202.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号