给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
1.递归实现
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
//递归解,中序是:先左子树再根结点最后右子树
vector<int> res;
if(root==nullptr)
return res;
CoreinorderTraversal(root,res);
return res;
}
private:
void CoreinorderTraversal(TreeNode* root,vector<int>& res)
{
if(root==nullptr)
return;
CoreinorderTraversal(root->left,res);
res.push_back(root->val);
CoreinorderTraversal(root->right,res);
}
};
2.非递归解,使用stack
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
struct Common{
string s; //go, print
TreeNode* node;
Common(string s,TreeNode* node):s(s),node(node){}
};
//非递归实现,利用stack来模拟递归实现的过程
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
if(root==nullptr)
return res;
stack<Common> stack;
stack.push(Common("go",root));
while(!stack.empty())
{
Common common=stack.top();
stack.pop();
if(common.s=="print")
res.push_back(common.node->val);
else //这里一定要明白,指令入栈的顺序和出栈的顺序是反的
{ //这题是中序遍历:先访问根结点-》左子树-》右子树;以此入栈的顺序相反
assert(common.s=="go");
if(common.node->right)
stack.push(Common("go",common.node->right));
stack.push(Common("print",common.node));
if(common.node->left)
stack.push(Common("go",common.node->left));
}
}
return res;
}
};