原题链接:leecode 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:
void inorder(TreeNode* root,vector<int>& res)
{
if(!root) return ;
inorder(root->left,res);
res.push_back(root->val);
inorder(root->right,res);
}
vector<int> inorderTraversal(TreeNode* root) {
if(!root) return {};
vector<int> res;
inorder(root,res);
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> inorderTraversal(TreeNode* root) {
if(!root) return {};
vector<int> res;
stack<TreeNode* > st;
while(!st.empty() || root!=nullptr)
{
while(root)
{
st.push(root);
root=root->left;
}
root=st.top(); st.pop();
res.push_back(root->val);
root=root->right;
}
return res;
}
};
Morris 遍历
参考链接:
/**
* 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) {
//Morris 遍历
vector<int> res;
if(!root) return res;
TreeNode* p1=root;
TreeNode* p2=nullptr;
while(p1)
{
if(!p1->left)
{
res.push_back(p1->val);
p1=p1->right;
}
else
{
p2=p1->left;
while(p2->right!=nullptr && p2->right!=p1)
{
p2=p2->right;
}
if(p2->right==nullptr)
{
p2->right=p1;
p1=p1->left;
}
else if(p2->right==p1)
{
res.push_back(p1->val);
p1=p1->right;
p2->right=nullptr;
}
}
}
return res;
}
};