给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,3,2]
方法1:递归方法
class Solution {
public:
void dfs(TreeNode* root, vector<int> &re){
if(!root) return;
dfs(root->left, re);
re.push_back(root->val);
dfs(root->right, re);
}
vector<int> inorderTraversal(TreeNode* root) {
vector<int>re;
dfs(root, re);
return re;
}
};
方法2:非递归方法,需要用栈来做:
(1)从根节点开始,先将根节点压入栈,然后再将其所有左子结点全部压入栈。
(2)然后取出栈顶节点,保存节点值。
(3)若栈顶节点存在右子节点,将当前指针移到其右子节点上,然后跳到(1);若不存在,则继续(2)。
这样就保证了访问顺序为左-根-右。
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int>re;
stack<TreeNode*> s;
while(root || !s.empty()){
while(root){
s.push(root);
root=root->left;
}
TreeNode *temp=s.top();
re.push_back(temp->val);
s.pop();
root=temp->right;
}
return re;
}
};