『 C++ 』二叉树进阶OJ题(上)

简介: 『 C++ 』二叉树进阶OJ题(上)

根据二叉树创建字符串 🦖

题目链接

🥩 题目描述

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

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

示例1:

输入: root = [ 1 , 2 , 3 , 4 ]

输出: 1 ( 2 ( 4 ) ) ( 3 )

解释: 初步转化后得到 1 ( 2 (4) () () ) ( 3 () () );

由题目可知,需要得到前序遍历的结果,即",左子树,右子树";

且示例中得到当左右子树为空时则不需要括号,左子树为空右子树不为空时左子树需要括号,右子树为空时括号省略;


🥩 解题思路

该题的解题思路即为采用分治的思路,将问题按照前序遍历的方式(“,左子树,右子树”)化为对应的结果;

返回值为string,所以当返回结果为数字时可以使用to_string()函数将数字结果转化为string返回;

根据前序遍历结果初步操作可以为:

class Solution {
public:
 string tree2str(TreeNode* root) {
     if(root == nullptr) return"";//当节点为空时不予操作返回空字符串
     return to_string(root->val) + "(" + tree2str(root->left) + ")" + "(" + tree2str(root->right) + ")"//问题转化为子问题即采用前序遍历的方式对其进行处理
 }

以示例1为例这里运行的结果为1 ( 2 (4) () () ) ( 3 () () );

接下来进行特殊处理:

当节点左右都为空时只需要返回节点本身的val;

当节点左为空右不为空时默认打印出左节点val及左节点的();

右节点为空左节点不为空时只打印左节点val以及所对应的();


🥩 代码

class Solution {
public:
    string tree2str(TreeNode* root) {
        if(root == nullptr) return"";//节点为空返回空字符串
        if(root->left == root->right && root->left == nullptr){
            return to_string(root->val);//左右子树都为空只返回该节点的val值
        }
        if(root->right == nullptr){
            return to_string(root->val) + "(" + tree2str(root->left) + ")";
            //右节点为空但左节点不为空时不打印右节点对应的()
            //左节点为空但右节点不为空时默认打印即可
        }
        return to_string(root->val) + "(" + tree2str(root->left) + ")" + "(" + tree2str(root->right) + ")";
    }
};

二叉树的层序遍历(分层遍历) 🦖

题目链接

🥩 题目描述

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

示例1:

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

输出 :[[3],[9,20],[15,7]];

由题可知,该题需要进行层序遍历,且使用C++解答时需要返回对应的二维数组;


🥩 解题思路

该题的解题思路与层序遍历如出一辙,可以使用queue容器对应的将节点进行保存;

且当访问一个根节点就代入对应的左右节点;

当然在入左右节点时需要判断节点是否为空,避免在对节点进行访问的时候出现非法的空指针引用;


🥩 代码

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        //返回一个vector<vector<int>> ,
        vector<vector<int>> ret;
        if(root == nullptr) return ret;//若是节点为空则直接返回一个空的vector<vector<int>>
        queue<TreeNode*> qLeve;//创建一个队列(LILO容器)保证能将数据节点按照顺序进行访问,且按照顺序进行父节点出子节点入的方式进行;
        qLeve.push(root);//为了保证下面的循环条件,先将根节点入队列
        while(!qLeve.empty()){//当根节点不为空时进行循环
            size_t leveSize = qLeve.size();
            //使用队列的queue::size()属性判断这次所入队列为多少需要进行几层判断
            //如第一层的节点只有一个节点(根节点),所以该层的数据只有一个
            vector<int> tmpV;//创建临时的vector用来返回每层的vector
            while(leveSize--){
                tmpV.push_back(qLeve.front()->val);//在vector中插入对应的数据
                //当一个节点出队时需要入其对应的左右子树
                if(qLeve.front()->left) qLeve.push(qLeve.front()->left) ;
                if(qLeve.front()->right) qLeve.push(qLeve.front()->right) ;
                qLeve.pop();//出节点
            }
            ret.push_back(tmpV);//将临时的vector放入至需要返回的vector<vector<int>>容器中
        }
        return ret;//返回二维数组
    }
};

二叉树的层序遍历(分层遍历)Ⅱ 🦖

题目链接

🥩 题目描述

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历);

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

输出 :[[15,7],[9,20],[3]];


🥩 解题思路

解题思路即为上题代码,当最终的vector>成型之后,将该容器对象使用reverse()函数进行逆置;

代码不再进行赘述;


『 C++ 』二叉树进阶OJ题(中)https://developer.aliyun.com/article/1424478

相关文章
|
4月前
|
存储 C++
【C++】二叉树进阶之二叉搜索树(下)
【C++】二叉树进阶之二叉搜索树(下)
32 4
|
4月前
|
Java 编译器 C++
【C++】二叉树进阶之二叉搜索树(上)
【C++】二叉树进阶之二叉搜索树(上)
36 3
|
5月前
|
安全 算法 C语言
【C++进阶】深入STL之string:掌握高效字符串处理的关键
【C++进阶】深入STL之string:掌握高效字符串处理的关键
59 1
【C++进阶】深入STL之string:掌握高效字符串处理的关键
|
4月前
|
算法 C++
【C++高阶】高效搜索的秘密:深入解析搜索二叉树
【C++高阶】高效搜索的秘密:深入解析搜索二叉树
42 2
|
5月前
|
编译器 C++
C++模板进阶
C++模板进阶
24 1
|
5月前
|
存储 算法 程序员
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
【C++进阶】深入STL之 栈与队列:数据结构探索之旅
56 4
|
5月前
|
算法 安全 编译器
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
【C++进阶】模板进阶与仿函数:C++编程中的泛型与函数式编程思想
50 1
|
5月前
|
存储 算法 程序员
【C++进阶】深入STL之vector:构建高效C++程序的基石
【C++进阶】深入STL之vector:构建高效C++程序的基石
52 1
|
5月前
|
编译器 C++
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
38 1
|
5月前
|
存储 缓存 编译器
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
【C++进阶】深入STL之list:模拟实现深入理解List与迭代器
36 0