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 实现二叉树先序,中序和后序遍历

     多总结,多体会各种方法。

NC45 实现二叉树先序,中序和后序遍历


欢迎评论区留言讨论哦

以上是关于NC45 实现二叉树先序,中序和后序遍历的主要内容,如果未能解决你的问题,请参考以下文章

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段

实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)

数据结构 递归和非递归方式实现二叉树先序中序和后序遍历

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码

创建二叉树非递归完成对二叉树的先序和后序遍历并遍历输出每一层的结点数查找结点P 和结点Q的最近共同祖先

已知一个二叉树的先序序列和中序序列,怎么求它的后序序列