实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)
Posted 码农指南
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)相关的知识,希望对你有一定的参考价值。
描述:
分别按照二叉树先序,中序和后序打印所有的节点。
示例1
输入:
{1,2,3}
返回值:
[[1,2,3],[2,1,3],[2,3,1]]
(题目来自牛客网)
用C++实现如下
class Solution {
public:
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型vector<vector<>>
*/
vector<vector<int>> threeOrders(TreeNode* root) {
// write code here
//思路,通过定义三个成员变量分别存放先序(根左右),中序(左根右),后序(左右根)结果。
vector<vector<int>> results;
if(root == nullptr)
return results;
preorder(root);
midorder(root);
postorder(root);
results = {pre, mid, post};
return results;
}
// //先序遍历思路1,使用迭代递归法进行求解
// void preorder(TreeNode* node)
// {
// if(node == nullptr)
// return;
// pre.push_back(node->val);
// preorder(node->left); //递归求解
// preorder(node->right);
// }
//先序遍历思路2,使用stack栈不为空时循环进行求解
void preorder(TreeNode* node)
{
stack<TreeNode*> s1; //定义一个栈用来存储各节点
s1.push(node); //然后把根部push进去
while(s1.size()) //不为空,则一直进行循环
{
TreeNode* cur = s1.top(); //找出stack中的top值
s1.pop(); //并使其出栈
pre.push_back(cur->val); //把其值存在需要存放的vector中
if(cur->right != nullptr) //右不为空则先push右边的进入
s1.push(cur->right); //进入容器,注意:先push右边的,因为先进后出
if(cur->left != nullptr) //左不为空则push左边的进入
s1.push(cur->left);
}
}
//中序遍历思路1,使用迭代递归法进行求解
// void midorder(TreeNode* node)
// {
// if(node == nullptr)
// return;
// midorder(node->left); //递归求解
// mid.push_back(node->val);
// midorder(node->right);
// }
//中序遍历思路2,使用stack栈不为空或者curr(因为最后将curr指向了右边)时的循环进行求解
void midorder(TreeNode* node)
{
stack<TreeNode*> s1; //定义一个栈用来存储各节点
TreeNode* curr = node; //定义当前的节点
while(s1.size() || curr) //不为空,则一直进行循环
{
while(curr)
{
s1.push(curr);
curr=curr->left; //若左有,一直取其左,直到节点空
}
curr = s1.top(); //找出stack中的top值,并使其出栈
s1.pop();
mid.push_back(curr->val); //先取其值,把其值存在需要存放的vector中
curr=curr->right; //再等其右(先序)
}
}
//后序遍历思路1,使用迭代递归法进行求解
void postorder(TreeNode* node)
{
if(node == nullptr)
return;
postorder(node->left);
postorder(node->right);
post.push_back(node->val);
}
//后序遍历思路2,后序非迭代递归法面试基本不考察,目前可以不掌握,需要的伙伴可以留言,我后续补上
private:
vector<int> pre, mid, post; //定义成员变量供函数调用
};
纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!
以上是关于实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章