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 herevector<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
总结
多总结,多体会各种方法。
欢迎评论区留言讨论哦
