一、题目
定义二叉树的结构
// Definition for a binary tree node.
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
中序遍历:左子树---> 根结点 ---> 右子树,上图的中序遍历:4 2 5 1 3 6,代码如何实现?
二、递归的方法
class Solution {
public:
vector<int> ans;
vector<int> inorderTraversal(TreeNode* root) {
if(root)
{
inorderTraversal(root->left);
ans.push_back(root->val);
inorderTraversal(root->right);
}
return ans;
}
};
三、非递归的方法
中序遍历的递归定义:先左子树,后根节点,再右子树。如何写非递归代码呢?一句话:让代码跟着思维走。我们的思维是什么?如果你对中序遍历理解透彻的话,你肯定先找到左子树的最下边的节点,同时保存一路走过的根节点(使用栈),理由是:中序遍历的需要遍历完左子树后,要借助根节点进入右子树。
1、新建一个栈——stack<TreeNode> NodeStack,用于存放叶子节点,同时新建一个vector<int>path存放结果
2、遍历左子树,将左子树的叶子节点全部压到栈中
3、左子树遍历完成后,如果栈不为空,将栈顶元素加入返回结果path中,并将当前节点指向右子树,然后依次弹出栈顶
4、若当前节点为空,则结束遍历;若当前节点不为空,则继续循环上述操作
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
if(root == nullptr){
return {};
}
vector<int> res;
stack<TreeNode*> stk;
TreeNode* cur = root;
while (cur != nullptr || !stk.empty()) {
while (cur != nullptr) {
stk.push(cur);
cur = cur->left;
}
TreeNode* node = stk.top();
stk.pop();
res.push_back(node->val);
if (node->right != nullptr) {
cur = node->right;
}
}
return res;
}
};
或者
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
if(root == nullptr){
return {};
}
vector<int> res;
stack<TreeNode*> stk;
TreeNode* cur = root;
while (cur != nullptr || !stk.empty()) {
if (cur != nullptr) {
stk.push(cur);
cur = cur->left;
} else { //cur == null && !stack.isEmpty()
TreeNode* node = stk.top();
stk.pop();
res.push_back(node->val);
cur = node->right;
}
}
return res;
}
};
参考: