本地由LeetCode输入构建二叉树(C++版)

引言

 LeetCode里涉及到二叉树的题都是采用了形如[1,2,3,4,NULL,5,NULL]这样的格式作为输入,其中NULL就表示该节点为空节点。LeetCode并没有给出如何通过这样一个数组进行二叉树的构建,但我们通过分析可以发现这实际上就是一个对二叉树的层次遍历过程,只不过空的叶子节点使用了NULL来进行占位。

方案

 为了方便在本地进行Debug,我们可以依据这一流程自己构造对应的二叉树。考虑到这一格式输入本身就是某种意义上的层次遍历,因此我们也只需要以层次遍历的方式来建树即可。层次遍历的写法中,我们是初始化了一个队列,循环地在每一层执行从左到右输出,从左到右子节点入队列的操作,代码为:

 vector<vector<int>> result;
 queue<TreeNode*> que;
 if(root) que.push(root);
 while(!que.empty()){
   
     vector<int> cur;
     int size=que.size();
     for(;size>0;size--){
   
         TreeNode* temp=que.front();
         que.pop();
         cur.push_back(temp->val);
         if(temp->left) que.push(temp->left);
         if(temp->right) que.push(temp->right);
     }
     result.push_back(cur);
 }
 return result;

 同理,我们也利用队列以层次遍历的方式来实现二叉树的构造。同样是遍历每一层,依据前一层的大小size来决定本层操作要从输入vector中读取多少个元素来构造子节点,每次构造的顺序为从左至右。考虑到输入使用了NULL来进行占位,使用迭代器遍历时读出的(*it)==0 ,因此我们要对这个空节点进行额外判断,如果为0,则当前处理节点的子节点为空,否则new一个值为(*it)的子节点。其余逻辑比较简单,不再赘述。具体代码见下:

class TreeNode{
   
    public:
        int val;
        TreeNode* left;
        TreeNode* right;
        TreeNode():val(0),left(NULL),right(NULL){
   }
        TreeNode(int v):val(v),left(NULL),right(NULL){
   }
};
TreeNode* CreatTree(vector<int> input){
   
    TreeNode* root;
    queue<TreeNode*> que;
    vector<int>::iterator it=input.begin();
    if(!input.empty()){
   
        root = new TreeNode(*(it++));
        que.push(root);
    }
    while(!que.empty() && it!=input.end()){
   
        int size=que.size();
        for(;size--;size>0){
   
            TreeNode* temp=que.front();
            que.pop();
            TreeNode* left=nullptr;
            TreeNode* right=nullptr;
            if (*it) {
   
                left = new TreeNode(*(it++));
            } else {
   
                it++;
            }

            if (*it) {
   
                right = new TreeNode(*(it++));
            } else {
   
                it++;
            }
            temp->left=left;
            temp->right=right;
            if(left) que.push(left);
            if(right) que.push(right);
        }
        
    }
    return root;
}

相关推荐

  1. 本地LeetCode输入构建(C++

    2024-01-12 07:56:06       52 阅读
  2. LeetCode——

    2024-01-12 07:56:06       54 阅读
  3. 的实现(纯C语言)

    2024-01-12 07:56:06       50 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-12 07:56:06       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-12 07:56:06       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-12 07:56:06       87 阅读
  4. Python语言-面向对象

    2024-01-12 07:56:06       96 阅读

热门阅读

  1. 探索计算机网络:应用层的魅力

    2024-01-12 07:56:06       55 阅读
  2. 计算机网络层之ICMP与IGMP

    2024-01-12 07:56:06       56 阅读
  3. 决策树回归(Decision Tree Regression)

    2024-01-12 07:56:06       59 阅读
  4. 视觉SLAM十四讲|【五】相机与IMU时间戳同步

    2024-01-12 07:56:06       52 阅读
  5. 自然语言处理(NLP)技术

    2024-01-12 07:56:06       51 阅读
  6. 使用Sqoop将Hive数据导出到TiDB

    2024-01-12 07:56:06       53 阅读
  7. k8s存储卷和数据卷下

    2024-01-12 07:56:06       46 阅读
  8. 力扣_数组27—最大矩形

    2024-01-12 07:56:06       59 阅读