题意:

  • 返回二叉树的中序遍历序列。

方法一:递归

解题思路:

  • 按照左子节点->根->右子节点的顺序,用递归的方式进行遍历。

代码如下:

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。