题目链接:94. 二叉树的中序遍历

题解:

开始进入二叉树的世界!

题目简述:

给定一个二叉树,返回中序遍历序列!

题解:

中序遍历:即左根右的顺序去遍历!

递归:

  • 从根节点开始遍历
  • 遍历左子树
  • 访问当前根节点
  • 遍历右子树
  • 递归到空节点返回

时间复杂度O(n)

AC代码一:递归实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* 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) {
dfs(root);
return res;
}
void dfs(TreeNode* root){
if(!root) return;
dfs(root->left);
res.push_back(root->val);
dfs(root->right);
}
};

AC代码:非递归实现(模板)

非递归:即借助栈来实现!

思想:

  • 先将左子树都压入栈中
  • 出栈栈顶
  • 指向当前栈顶的右子树

终止条件: 栈空并且当前节点为空

时间复杂度O(n)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 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;
stack<TreeNode*> stk;
while(root || stk.size()){
while(root){
stk.push(root);
root = root->left;
}
root = stk.top();
stk.pop();
res.push_back(root->val);
root = root->right;
}
return res;
}
};