非递归实现二叉树的前、中、后序遍历

86 篇文章 0 订阅

二叉树的前序遍历

题目链表:二叉树的前序遍历

题目描述

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
在这里插入图片描述

题目分析

非递归实现二叉树的前序遍历,这里可以先定义一个栈来存放给个节点。前序遍历的顺序是根左右,因此根据栈的后进先出原则,可以先将各个节点入栈,然后依次取出栈顶元素,将其再依次出栈,并遍历右子树中的节点。具体代码实现如下:

代码实现

vector<int> preorderTraversal(TreeNode* root) 
{
	vector<int> ret;
	stack<TreeNode*> st;
	TreeNode* cur = root;
	while (cur || !st.empty())
	{
		while (cur)
		{
			st.push(cur);
			ret.push_back(cur->val);
			cur = cur->left;
		}
		TreeNode* tmp = st.top();
		st.pop();
		cur = tmp->right;
	}
	return ret;
}

在这里插入图片描述

二叉树的中序遍历

题目链接:二叉树的中序遍历

题目描述

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
在这里插入图片描述

题目分析

正常递归实现二叉树的中序遍历只需要按照左根右的顺序来实现即可,这里尝试非递归来实现二叉树的中序遍历。二叉树的中序遍历和前序类似,区别在于一个先入根节点一个先入左节点,注意入vector的时间即可,代码实现如下:

代码实现

vector<int> inorderTraversal(TreeNode* root) 
{
	vector<int> ret;
	stack<TreeNode*> st;
	TreeNode* cur = root;
	while (cur || !st.empty())
	{
		while (cur)
		{
			st.push(cur);
			cur = cur->left;
		}
		TreeNode* tmp = st.top();
		ret.push_back(tmp->val);
		st.pop();
		cur = tmp->right;

	}
	return ret;
}

在这里插入图片描述

二叉树的后序遍历

题目链接:二叉树的后序遍历

题目描述

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。
在这里插入图片描述

题目分析

正常来说实现二叉树的后序遍历使用递归的方式很简单,按照左右根的顺序即可,但是如果这棵树的递归深度太深可能会导致栈溢出,使用非递归的方式便可以解决这个问题。如何非递归实现二叉树的后序遍历呢?和前序和中序遍历有一些区别,他需要先访问左节点和右节点再去访问根,于是这里需要做一个标记,是否已经访问过该节点的右子树节点,如果是则可以将根遍历,如果还没有访问,则需要先去访问右子树节点,代码实现如下:

代码实现

    vector<int> postorderTraversal(TreeNode* root) 
    {
	vector<int> ret;
	stack<TreeNode*> st;
	TreeNode* cur = root;
	TreeNode* prev = nullptr;
	while (cur || !st.empty())//两者都不为空时进入循环
	{
		while (cur)//节点不为空时,左子树节点入栈
		{
			st.push(cur);
			cur = cur->left;
		}
		TreeNode* tmp = st.top();
		if (tmp->right == nullptr || tmp->right == prev)
		{
			ret.push_back(tmp->val);
			prev = tmp;
			st.pop();
		}
		else
		{
			cur = tmp->right;
		}
	}
	return ret;
    }

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树的遍历方式有三种:前序遍历、中序遍历后序遍历前序遍历:先遍历根节点,然后遍历左子树,最后遍历右子树。其遍历顺序为:根节点 -> 左子树 -> 右子树。 中序遍历:先遍历左子树,然后遍历根节点,最后遍历右子树。其遍历顺序为:左子树 -> 根节点 -> 右子树。 后序遍历:先遍历左子树,然后遍历右子树,最后遍历根节点。其遍历顺序为:左子树 -> 右子树 -> 根节点。 下面是二叉树后序遍历的递归实现代码: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def preorderTraversal(root: TreeNode) -> List[int]: res = [] def dfs(node): if not node: return res.append(node.val) dfs(node.left) dfs(node.right) dfs(root) return res def inorderTraversal(root: TreeNode) -> List[int]: res = [] def dfs(node): if not node: return dfs(node.left) res.append(node.val) dfs(node.right) dfs(root) return res def postorderTraversal(root: TreeNode) -> List[int]: res = [] def dfs(node): if not node: return dfs(node.left) dfs(node.right) res.append(node.val) dfs(root) return res ``` 以上代码,TreeNode 表示二叉树的节点,preorderTraversal、inorderTraversal 和 postorderTraversal 分别表示前序遍历、中序遍历后序遍历的函数。每个函数都是通过递归实现的,dfs 函数用来遍历节点,将节点的值加入 res

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值