二叉树

144. 二叉树的前序遍历

94. 二叉树的中序遍历

145. 二叉树的后序遍历

题意:给你二叉树的根节点root,返回它节点值的 前序 / 中序 / 后续 遍历。

示例:

算法练习-day12_递归

       思路:本题是学习二叉树必须会的的题,三种遍历方式,我们都可以使用递归,栈等方式进行正确的遍历输出,这里我给出了递归遍历和栈模拟实现的代码

前序遍历递归代码:

    vector<int> arr;
    vector<int> preorderTraversal(TreeNode* root) {
        if(nullptr==root)
        {
            return arr;
        }
        arr.push_back(root->val);
        preorderTraversal(root->left);
        preorderTraversal(root->right);
        return arr;
    }

前序遍历栈模拟实现的代码:

    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> s;
        vector<int> arr;
        s.push(root);
        while(!s.empty())
        {
            TreeNode* cur=s.top();
            s.pop();
            if(nullptr==cur)//为空时,直接到下一个节点
            {
                continue;
            }
            arr.push_back(cur->val);
            s.push(cur->right);//需要注意,由于栈的排序是逆序的,因此是右左遍历
            s.push(cur->left);
        }
        return arr;
    }

中序遍历递归代码:

    vector<int> arr;
    vector<int> inorderTraversal(TreeNode* root) {
        if(nullptr==root)
        {
            return arr;
        }
        inorderTraversal(root->left);
        arr.push_back(root->val);
        inorderTraversal(root->right);
        return arr;
    }

中序遍历栈模拟实现的代码:

    vector<int> inorderTraversal(TreeNode* root) {
        stack<TreeNode*> s;
        vector<int> arr;
        TreeNode* cur=root;
        while(nullptr!=cur||!s.empty())
        {
            if(nullptr!=cur)//当左边有节点时,我们需要一直向左移动
            {
                s.push(cur);
                cur=cur->left;
            }
            else
            {
                arr.push_back(s.top()->val);//到底时,我们输出叶子节点,并向右移动
                cur=s.top()->right;
                s.pop();
            }
        }
        return arr;
    }

后序遍历递归代码:

    vector<int> arr;
    vector<int> postorderTraversal(TreeNode* root) {
        if(nullptr==root)
        {
            return arr;
        }
        postorderTraversal(root->left);
        postorderTraversal(root->right);
        arr.push_back(root->val);
        return arr;
    }

后序遍历栈模拟实现的代码:

    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> s;
        vector<int> arr;
        s.push(root);
        while(!s.empty())
        {
            TreeNode* cur=s.top();
            s.pop();
            if(nullptr==cur)
            {
                continue;
            }
            arr.push_back(cur->val);
            s.push(cur->left);//和前序遍历刚好相反,此时获取的就是后序遍历的反向节点
            s.push(cur->right);
        }
        reverse(arr.begin(),arr.end());//反转回正常顺序
        return arr;
    }