题目描述:
给定一个二叉树,返回它的中序 遍历。
示例:
输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,3,2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
思路:
1、常规的中序递归法
void traverse(TreeNode* root)
{
if(root != NULL)
{
traverse(root.left);
visit(root);
traverse(root.right);
}
}
2、手动模拟递归栈。关键是循环中会有 栈空的状态,但是遍历并没有结束。所有while循环的判断条件需要注意下。
递归
/**
* 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> res;
vector<int> inorderTraversal(TreeNode* root) {
if(root == NULL) return res;
inorderTraversal(root->left);
res.push_back(root->val);
inorderTraversal(root->right);
return res;
}
};
非递归
/**
* 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;
TreeNode* stack[1000];
int top = -1;
TreeNode* p;
p = root;
if(p == NULL) return res;
while(top != -1 || p != NULL)//此处的 或 条件,表示:栈不空或者树不空。需要注意同时不满足才能退出循环
{
while(p != NULL){
stack[++top] = p;
p = p->left;
}
if(top != -1){
p = stack[top--];
res.push_back(p->val);
p = p->right;
}
}
return res;
}
};