【刷题记录】关于二叉树的OJ题(上)

简介: 【刷题记录】关于二叉树的OJ题(上)

1.根据二叉树创建字符串


题目链接:606. 根据二叉树创建字符串 - 力扣(LeetCode)

题干:

给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。

空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

示例 1:

cons1-tree.jpg

输入:root = [1,2,3,4]
输出:"1(2(4))(3)"
解释:初步转化后得到 "1(2(4)())(3()())" ,但省略所有不必要的空括号对后,字符串应该是"1(2(4))(3)" 。

示例 2:

cons2-tree.jpg

输入:root = [1,2,3,null,4]
输出:"1(2()(4))(3)"
解释:和第一个示例类似,但是无法省略第一个空括号对,否则会破坏输入与输出一一映射的关系。

题目分析:

这是一道力扣简单题,显而易见使用先序遍历即可,但是这里需要注意到的点就是,用括号把子树括起来这一点,需要我们着重考虑一下。因为其中有的情况要省略空括号,有的情况不能省略。分析题目可知,当该节点左子树为nullptr,并且右子树有值时不能省略


代码实现:

class Solution {
public:
    string tree2str(TreeNode* root) {
    if(root == nullptr)//当树为空树的时候,遍历之后的结果是空字符串
            return string();
        string str;//创建字符串保存结果
        str += to_string(root->val);//线序遍历,首先把根节点的值放进str,这里需要把val的类型转换成string类型才能追加
        //先序遍历,首先走左子树,然后走右子树
        if(root->left)//左子树不为空时,先序遍历左子树,然后把左子树的字符串加上括号追加到str上
        {
            str += '(';
            str += tree2str(root->left);
            str += ')';
        }
        else if(root->right)//左子树为空,且右子树不为空时
        {
            //此时左子树的空括号不能省略
            str += "()";
        }
        if(root->right)//右子树不为空时,先序遍历右子树
        {
            str += '(';
            str += tree2str(root->right);
            str += ')';            
        }
        return str;
    }
};

image-20230506145824561.png


2.二叉树的层序遍历


题目链接:102. 二叉树的层序遍历 - 力扣(LeetCode)

题干:

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

示例1

tree1.jpg

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例二

输入:root = [1]
输出:[[1]]

示例三

输入:root = []
输出:[]


题目分析:


二叉树的层序遍历,我们需要借助一下队列的数据结构,将每一层的节点放进队列中,然后需要在访问当前层节点的时候拿到当前节点的子节点,否则后面就找不到子节点了。所以思路就是首先非空节根节点入队列,然后每次出队列时,把该节点的子节点依次入队列,这要就能达到层序的目的,看起来很完美,但是注意一下题目示例,需要我们按照每层节点存放在一个单独的vector中,这就产生了一个问题:怎么判断当前节点是第几层的?仔细分析可知,队列中存放的节点只有两种可能:1.只有当前节点所在层数的节点;2.有当前节点所在层节点和下一层的部分节点,那我们采用一个变量存放当前层的节点个数,然后每当出一个节点就自减,直到为0时,队列中存放的节点个数就是下一层的节点个数,通过这个变量来控制存入第几个vector即可。


代码实现:

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> vv;
        queue<TreeNode*> q;
        int levelSize = 0;//存放当前层的节点个数
        if(root)
        {
            q.push(root);
            levelSize = 1;
        }
        while(!q.empty())
        {
            vector<int> v;//存放每一层的值,一层一层push_back到vv中
            while(levelSize--)
            {
                TreeNode* top = q.front();
                q.pop();
                v.push_back(top->val);
                if(top->left)
                    q.push(top->left);
                if(top->right)
                    q.push(top->right);
            }
            levelSize = q.size();
            vv.push_back(v);
        }
        return vv;
    }
};


image-20230506152450991.png

拓展与补充:107. 二叉树的层序遍历 II - 力扣(LeetCode)

这是上一道题的扩展,让我们自低向上层序遍历,这里有一个最简单的办法就是按照上述的代码走一遍,然后在return之前reverse一下即可。

相关文章
|
7月前
|
算法
OJ刷题:《剑指offer》之左旋字符串!
OJ刷题:《剑指offer》之左旋字符串!
|
7月前
|
C++ 容器
『 C++ 』二叉树进阶OJ题(上)
『 C++ 』二叉树进阶OJ题(上)
『 C++ 』二叉树进阶OJ题(上)
|
7月前
二叉树OJ题目(2)
二叉树OJ题目(2)
35 0
|
7月前
|
C++ 容器
『 C++ 』二叉树进阶OJ题(中)
『 C++ 』二叉树进阶OJ题(中)
|
7月前
|
存储 C++ 容器
『 C++ 』二叉树进阶OJ题(下)
『 C++ 』二叉树进阶OJ题(下)
|
7月前
|
存储 算法
二叉树进阶OJ题
二叉树进阶OJ题
41 0
|
存储 算法
顺序表、链表刷题指南(力扣OJ)
顺序表、链表刷题指南(力扣OJ)
67 0