一.题目
给定一个二叉树的根节点 root
,返回它的 中序 遍历
二.方法
-
递归
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> vint;
vector<int> inorderTraversal(TreeNode* root) {
if(root == nullptr)
return vint;
else{
inorderTraversal(root->left);
vint.push_back(root->val);
inorderTraversal(root->right);
}
return vint;
}
};
注意:vector容器要在函数外定义,若将vector定义在函数里面,每次递归完返回的值都会更新,所以这里就相当于定义成全局变量
-
迭代
迭代算法的话,需要使用栈来存储第一次遇到的节点,具体的思路(中序遍历)是:
- 初始化一个栈
- 根节点入栈,然后遍历左子树,直到左子树为空
- 将根节点出栈,将根节点的值保存到vector<int>容器中,再遍历右子树
最终出循环的条件是栈为空了且整个树都被遍历了一遍。
class Solution {
public:
vector<int> vint;
vector<int> inorderTraversal(TreeNode* root) {
TreeNode* p = root;
stack<TreeNode> sTreeNode;
while(p||!sTreeNode.empty()){
if(p){
sTreeNode.push(*p);
p = p->left;
}
else{
vint.push_back(sTreeNode.top().val);
p = sTreeNode.top().right;
sTreeNode.pop();
}
}
return vint;
}
};