实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)相关的知识,希望对你有一定的参考价值。

描述:
分别按照二叉树先序,中序和后序打印所有的节点。
示例1
输入:
{1,2,3}
返回值:
[[1,2,3],[2,1,3],[2,3,1]]
(题目来自牛客网)

用C++实现如下

class Solution {
public:
    /**
     * 
     * @param root TreeNode类 the root of binary tree
     * @return int整型vector<vector<>>
     */
    vector<vector<int>> threeOrders(TreeNode* root) {
        // write code here
        //思路,通过定义三个成员变量分别存放先序(根左右),中序(左根右),后序(左右根)结果。
        vector<vector<int>> results;
        if(root == nullptr)
            return results;
        preorder(root);                         
        midorder(root);
        postorder(root);
        results = {pre, mid, post};
        return results;
    }
    
//     //先序遍历思路1,使用迭代递归法进行求解
//     void preorder(TreeNode* node)
//     {
//         if(node == nullptr)
//             return;
//         pre.push_back(node->val);
//         preorder(node->left);          //递归求解
//         preorder(node->right);
//     }
    
    //先序遍历思路2,使用stack栈不为空时循环进行求解
    void preorder(TreeNode* node)
    {
        stack<TreeNode*> s1;              //定义一个栈用来存储各节点
        s1.push(node);                    //然后把根部push进去
        while(s1.size())                  //不为空,则一直进行循环
        {
            TreeNode* cur = s1.top();     //找出stack中的top值
            s1.pop();                     //并使其出栈
            pre.push_back(cur->val);      //把其值存在需要存放的vector中
            if(cur->right != nullptr)     //右不为空则先push右边的进入
                s1.push(cur->right);      //进入容器,注意:先push右边的,因为先进后出
            if(cur->left != nullptr)      //左不为空则push左边的进入
                s1.push(cur->left);
        }
    }
    
    
       //中序遍历思路1,使用迭代递归法进行求解
//     void midorder(TreeNode* node)
//     {
//         if(node == nullptr)
//             return;
//         midorder(node->left);       //递归求解
//         mid.push_back(node->val);
//         midorder(node->right);
//     }
    
    
    //中序遍历思路2,使用stack栈不为空或者curr(因为最后将curr指向了右边)时的循环进行求解
    void midorder(TreeNode* node)
    {
        stack<TreeNode*> s1;          //定义一个栈用来存储各节点
        TreeNode* curr = node;        //定义当前的节点
        while(s1.size() || curr)      //不为空,则一直进行循环
        {
            while(curr)
            {
                s1.push(curr);
                curr=curr->left;      //若左有,一直取其左,直到节点空
            }
            curr = s1.top();          //找出stack中的top值,并使其出栈
            s1.pop();
            mid.push_back(curr->val); //先取其值,把其值存在需要存放的vector中
            curr=curr->right;         //再等其右(先序)
        }
    }

    
    //后序遍历思路1,使用迭代递归法进行求解
    void postorder(TreeNode* node)
    {
        if(node == nullptr)
            return;
        postorder(node->left);
        postorder(node->right);
        post.push_back(node->val);
    }
    
    //后序遍历思路2,后序非迭代递归法面试基本不考察,目前可以不掌握,需要的伙伴可以留言,我后续补上
  
private:
    vector<int> pre, mid, post;      //定义成员变量供函数调用
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章

输出二叉树的先序中序和后序遍历序列

树——二叉树的先序中序和后序遍历

PTA 二叉树的三种遍历(先序中序和后序)

已知一个二叉树的先序序列和中序序列,怎么求它的后序序列

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码

创建二叉树非递归完成对二叉树的先序和后序遍历并遍历输出每一层的结点数查找结点P 和结点Q的最近共同祖先