二叉树的中序遍历
题目描述:给定一个二叉树,返回它的前序遍历。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [1,2,3]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
解题思路:本题使用递归的话,就浪费了这一题。如果不适用递归,而是使用非递归的遍历方法,大题思路就是遍历左孩子,并且同时入栈,一直走到空,此后,弹出栈顶元素,插入到结果数组中,如果栈顶元素还有右孩子,那么就访问有孩子,操作和之前一样,直至栈空,所有结点全部遍历完成,虽然思路比较清晰,但是在实现过程中,还是有碰到一些问题,要反思一下,还是模拟的时候有点晕。
递归实现
class Solution {
public:
vector<int>result;
vector<int> inorderTraversal(TreeNode* root) {
inorder(root);
return result;
}
void inorder(TreeNode* p){
if(p){
inorder(p->left);
result.push_back(p->val);
inorder(p->right);
}
}
};
非递归实现
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
vector<int>result;
if(!root)return result;
stack<TreeNode*>st1;
TreeNode *p;
p=root;
while(!st1.empty()||p){
while(p){
st1.push(p);
p=p->left;
}
p=st1.top();
result.push_back(p->val);
st1.pop();
p=p->right;
}
return result;
}
};