二叉树的前序、中序、后续遍历,用递归方法很好写,代码很精简,但是之前也学习过。递归方法实际上都是依托 栈来实现的,所以二叉树的前、中、后序遍历也均可以使用 栈来实现。 以下,分别给出递归 以及 使用迭代(栈)实现二叉树 前中后序遍历的代码。因为递归方法都比较简单,就不过多赘述,主要是迭代法的实现,需要一点技巧(尤其是 中序遍历)。
144. 二叉树的前序遍历
前序遍历比较简单一点,很容易想到。
/**
* Definition for a binary tree node.
* 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:
void traversal(TreeNode *node, vector<int> &res)
{
if(node == nullptr)
return;
res.push_back(node->val);
traversal(node->left, res);
traversal(node->right, res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
traversal(root, res);
return res;
}
};
*/
/*------------------------------
递归方法
-------------------------------*/
/*
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root)
{
if(root == nullptr)
return res;
res.push_back(root->val);
preorderTraversal(root->left);
preorderTraversal(root->right);
return res;
}
private:
vector<int> res;
};
*/
/*----------------------------------------
利用栈来实现
----------------------------------------*/
class Solution {
public:
vector<int> preorderTraversal(TreeNode* root)
{
vector<int> res;
stack<TreeNode *> record;
if(root == nullptr)
return res;
record.push(root);
while(!record.empty())
{
TreeNode* temp = record.top();
res.push_back(temp->val);
record.pop();
/*---------------------------------------
这边需要注意,因为使用的栈(先进后出)
所以在入栈的时候,要先入 右节点,再入 左节点
----------------------------------------*/
if(temp->right)
record.push(temp->right);
if(temp->left)
record.push(temp->left);
}
return res;
}
};
94. 二叉树的中序遍历
中序遍历的迭代法还是需要一些技巧的,跟前序遍历的套路不一样。
一开始自己写的时候,就没有考虑好。写出来一个死循环。
/**
* Definition for a binary tree node.
* 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> inorderTraversal(TreeNode* root) {
if(root == nullptr)
return res;
inorderTraversal(root->left);
res.push_back(root->val);
inorderTraversal(root->right);
return res;
}
private:
vector<int> res;
};
*/
/*-----------------------------------------------
迭代法
------------------------------------------------*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode *> record;
TreeNode* curr = root;
while( curr != nullptr || !record.empty())
{
if(curr != nullptr)
{
record.push(curr);
curr = curr->left;
}
else
{
curr = record.top();
res.push_back(curr->val);
record.pop();
curr = curr->right;
}
}
return res;
}
};
- 二叉树的后序遍历
后序遍历这里,是以前序遍历为基础写的。
可以发现,前序遍历 是 中->左->右
后序遍历 是 左->右->中
由 前序 到 后序遍历 实际上就是 两步:
中->左->右(前序遍历) ---- 左、 右 翻转----> 中->右->左(中间步骤)
中->右->左(中间步骤) ------ 翻转输出 ------> 左->右->中(后序遍历)
/**
* Definition for a binary tree node.
* 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) {
if(root == nullptr)
return res;
postorderTraversal(root->left);
postorderTraversal(root->right);
res.push_back(root->val);
return res;
}
private:
vector<int> res;
};
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
stack<TreeNode*> record;
if(root == nullptr)
return res;
record.push(root);
while(!record.empty())
{
TreeNode* temp = record.top();
res.push_back(temp->val);
record.pop();
if(temp->left) record.push(temp->left);
if(temp->right) record.push(temp->right);
}
reverse(res.begin(), res.end());
return res;
}
};