二叉树前序、中序和后序的遍历方法(递归、用栈和使用线索化)

本文介绍了二叉树的基本概念,并详细讲解了三种遍历方法:递归法、栈实现的非递归法以及线索化实现的遍历,其中线索化遍历具有空间复杂度o(1)的优势。
摘要由CSDN通过智能技术生成

0、二叉树数据结构定义

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode(int x): val(x), left(NULL), right(NULL) {}
};

1、二叉树遍历的递归法

二叉树遍历的递归法比较简单,这里直接贴出代码。

先序遍历——按照“根节点-左孩子-右孩子”的顺序进行访问。
vector<int> pre_Traversal_Recursive(TreeNode* root)
{
    vector<int> result;//存放遍历之后结点的值
    pre_Traversal_Recursive_core(root, result);
    return result;
}

void pre_Traversal_Recursive_core(TreeNode* node, vector<int> &result)
{
    if (!node) return;
    result.push_back(node->val);
    pre_Traversal_Recursive_core(node->left, result);
    pre_Traversal_Recursive_core(node->right, result);
}
这里是根据LeetCode上的要求写的,因为需要一个vector容器返回遍历的结果,所以这里使用了两个函数实现。
中序遍历——按照“ 左孩子 - 根节点-右孩子”的顺序进行访问。
vector<int> in_Traversal_Recursive(TreeNode* root)
{
    vector<int> result;//存放遍历之后结点的值
    pre_Traversal_Recursive_core(root, result);
    return result;
}

void in_Traversal_Recursive_core(TreeNode* node, vector<int> &result)
{
    if (!node) return;
    pre_Traversal_Recursive_core(node->left, result);
    result.push_back(node->val);
    pre_Traversal_Recursive_core(node->right, result);
}
后序遍历——按照“左孩子-右孩子-根节点”的顺序进行访问。
vector<int> post_Traversal_Recursive(TreeNode* root)
{
    vector<int> result;//存放遍历之后结点的值
    pre_Traversal_Recursive_core(root, result);
    return result;
}

void post_Traversal_Recursive_core(TreeNode* node, vector<int> &result)
{
    if (!node) return;
    pre_Traversal_Recursive_core(node->left, result);
    pre_Traversal_Recursive_core(node->right, result);
    result.push_back(node->val);
}

2、用栈来实现二叉树的非递归遍历

先序遍历的非递归实现
先序遍历原理:对于任一结点P,
1)输出节点P,然后将其入栈,再看P的左孩子是否为空;
2)若P的左孩子不为空,则置P的左孩子为当前节点,重复1)的操作;
3)若P的左孩子为空,则将栈顶节点出栈,但不输出,并将出栈节点的右孩子置为当前节点,看其是否为空;
4)若不为空,则循环至1)操作;
5)如果为空,则继续出栈,但不输出,同时将出栈节点的右孩子置为当前节点,看其是否为空,重复4)和5)操作;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值