题意:
- 返回二叉树的中序遍历序列。
方法一:递归
解题思路:
- 按照左子节点->根->右子节点的顺序,用递归的方式进行遍历。
代码如下:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型vector
*/
//s存中序遍历结果
vector<int> ans;
//辅助函数
void helper(TreeNode* root){
if(root==nullptr)
return;
//中序递归遍历
helper(root->left);
ans.push_back(root->val);
helper(root->right);
}
vector<int> inorderTraversal(TreeNode* root) {
// write code here
helper(root);
return ans;
}
};复杂度分析:
时间复杂度:,n为节点数量,每个节点遍历一次。
空间复杂度:,取决于递归层数,即树的深度,当二叉树退化为单链表时,时间复杂度最高为
。
方法二:迭代
解题思路:
- 1.以迭代的方式遍历:首先要找到中序遍历的起始节点,如17-21行代码所示,将根节点root的左子节点循环入栈,直到整个二叉树最左的节点,该节点即为中序遍历的第一个节点。
- 2.用栈s存按照中序遍历顺序的节点,每次从栈中取出一个节点,即是当前时刻的根节点,将根节点的值加入到返回结果序列ans后,判断根节点的右子节点是否存在,若存在,则将该右子节点当做新的根节点,将该节点的左子节点循环入栈,类似1中的过程,1是整体的中序遍历,而此过程是局部的中序遍历。
代码如下:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类
* @return int整型vector
*/
vector<int> inorderTraversal(TreeNode* root) {
// write code here
//中序遍历序列返回结果
vector<int> ans;
//s存迭代下的遍历节点
stack<TreeNode*> s;
//将root的左节点循环入栈,直到找到最左的节点,也即是中序遍历的起始节点
TreeNode* node1=root;
while(node1){
s.push(node1);
node1=node1->left;
}
while(!s.empty()){
//左->根->右 遍历至根
TreeNode* cur=s.top();
s.pop();
ans.push_back(cur->val);
//左->根->右 遍历至右,以右子节点为新的根节点,将该节点的左子节点循环入栈
if(cur->right){
TreeNode* tmp=cur->right;
while(tmp){
s.push(tmp);
tmp=tmp->left;
}
}
}
return ans;
}
};图解如下:
复杂度分析:
时间复杂度:,n为节点数量,每个节点遍历一次。
空间复杂度:,栈s存遍历节点的顺序,最多为n。



京公网安备 11010502036488号