NC45 实现二叉树先序,中序和后序遍历
Posted coder 靓仔
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NC45 实现二叉树先序,中序和后序遍历相关的知识,希望对你有一定的参考价值。
情景提要
牛客题解系列,按照题号顺序开始。
NC45 实现二叉树先序,中序和后序遍历
01
题目描述
分别按照二叉树先序,中序和后序打印所有的节点。
02
输入输出示例
输入:
{1,2,3}
返回值:
[[1,2,3],[2,1,3],[2,3,1]]
03
题目分析
思路
前序遍历: 中左右
中序遍历: 左中右
后序遍历: 左右中
可以分为递归和迭代两类方法。
递归方法较为简单,按顺序写就好了。
迭代方法分为一般写法和统一写法。前序和后序的一般写法比较简单,类似,后序在前序的基础上小改加倒序就可以了,中序较麻烦。统一写法很巧妙,用空指针来记录节点路径。总之,都可以在草稿纸上多画多模拟,才能多体会。统一写法看起来就像是一个模板啦。
03
代码实现
统一方法
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
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>> res(3,vector<int>());
res[0] = preorder(root);
res[1] = inorder(root);
res[2] = postorder(root);
return res;
}
vector<int> preorder(TreeNode* root){
stack<TreeNode*> st;
vector<int> ret;
if(root) st.push(root);
while(!st.empty()){
TreeNode* node = st.top();
st.pop();
if(node){
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
st.push(node);
st.push(nullptr);
}
else {
TreeNode* tmp = st.top();
st.pop();
ret.push_back(tmp->val);
}
}
return ret;
}
vector<int> inorder(TreeNode* root){
stack<TreeNode*> st;
vector<int> ret;
if(root) st.push(root);
while(!st.empty()){
TreeNode* node = st.top();
st.pop();
if(node){
if(node->right) st.push(node->right);
st.push(node);
st.push(nullptr);
if(node->left) st.push(node->left);
}
else {
TreeNode* tmp = st.top();
st.pop();
ret.push_back(tmp->val);
}
}
return ret;
}
vector<int> postorder(TreeNode* root){
stack<TreeNode*> st;
vector<int> ret;
if(root) st.push(root);
while(!st.empty()){
TreeNode* node = st.top();
st.pop();
if(node){
st.push(node);
st.push(nullptr);
if(node->right) st.push(node->right);
if(node->left) st.push(node->left);
}
else {
TreeNode* tmp = st.top();
st.pop();
ret.push_back(tmp->val);
}
}
return ret;
}
};
递归方法
**
* 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 travel(TreeNode * node,vector<int> &res){
if (node == NULL) return;
res.push_back(node->val);
travel(node->left,res);
travel(node->right,res);
}
vector<int> preorderTraversal(TreeNode* root) {
vector<int> result; //返回的结果
travel(root,result);
return result;
}
};
/**
* 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 travel(TreeNode* node,vector<int> &res){
if(node == NULL) return;
travel(node->left,res);
res.push_back(node->val);
travel(node->right,res);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int> result;
travel(root,result);
return result;
}
};
/**
* 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 travel(TreeNode* node,vector<int> &res){
if (node==NULL) return;
travel(node->left,res);
travel(node->right,res);
res.push_back(node->val);
}
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
travel(root,result);
return result;
}
};
一般方法
/**
* 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> preorderTraversal(TreeNode* root) {
vector<int> result; //返回的结果
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* tmp = st.top();
st.pop();
if(tmp!=NULL) result.push_back(tmp->val);
else continue;
st.push(tmp->right);
st.push(tmp->left);
}
return result;
}
}
/**
* 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) {
stack<TreeNode*> st;
TreeNode* cur = root;
vector<int> result;
while(!st.empty()||cur!=nullptr){
if(cur!=nullptr){
st.push(cur);
cur = cur->left;
}
else{
cur = st.top();
st.pop();
result.push_back(cur->val);
cur = cur->right;
}
}
return result;
}
};
/**
* 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:
//后序遍历 左右中 迭代法
// 1.中右左 (类似前序遍历)
// 2.左右中 (再倒过来)
vector<int> postorderTraversal(TreeNode* root) {
vector<int> result;
stack<TreeNode*> st;
st.push(root);
while(!st.empty()){
TreeNode* tmp = st.top();
st.pop();
if(tmp!=NULL) result.push_back(tmp->val);
else continue;
st.push(tmp->left);
st.push(tmp->right);
}
for(int i=0;i<result.size()/2;i++){
int temp = result[i];
result[i] = result[result.size()-i-1];
result[result.size()-i-1] = temp;
}
return result;
}
};
04
总结
多总结,多体会各种方法。
欢迎评论区留言讨论哦
以上是关于NC45 实现二叉树先序,中序和后序遍历的主要内容,如果未能解决你的问题,请参考以下文章
NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段
实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)
通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码