首页 > 其他分享 >从数组中构建二叉树

从数组中构建二叉树

时间:2023-08-23 21:44:54浏览次数:35  
标签:right TreeNode nums que 二叉树 数组 构建 root left

#include <iostream>
#include <sstream>
#include <stack>
#include <vector>
#include <queue>
using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

TreeNode* buildTree(vector<int>& nums){
    vector<TreeNode*> vecTree(nums.size(), nullptr);
    for(int i=0; i<nums.size(); i++){
        if(nums[i] != -1){
            vecTree[i] = new TreeNode(nums[i]);
        }
    }
    // i为节点时,左子树为2*i+1,右节点为2*i+2
    for(int i=0; 2*i+1 < nums.size(); ++i){
        if(vecTree[i] != nullptr){
            vecTree[i]->left = vecTree[2*i+1];
            if(2*i+2 < vecTree.size()){
                vecTree[i]->right = vecTree[2*i+2];
            }
        }
    }
    return vecTree[0];
}

TreeNode* buildTreeDFS(const vector<int>& nums, int index){
    if(index >= nums.size() || nums[index] == -1) return nullptr;   // 空节点
    TreeNode* node = new TreeNode(nums[index]);
    node->left = buildTreeDFS(nums, index*2 +1);
    node->right = buildTreeDFS(nums, index*2 +2);
    return node;
}

TreeNode* buildTreeQueue(vector<int>& nums){
    queue<TreeNode*> que;
    TreeNode* root=nullptr;
    if(!nums.empty()) {
        root = new TreeNode(nums[0]);
        que.push(root);
    }
    int idx=0;
    while(!que.empty()){
        int len = que.size();
        for(size_t i=0; i< len;++i){
            auto cur = que.front();que.pop();
            if(nums[idx] == -1) {
                ++idx;
                continue;
            }
            cout << cur->val << " ";
            // 当前节点的左节点
            if((idx*2+1 < nums.size()) && nums[idx*2+1] != -1){
                cur->left = new TreeNode(nums[idx*2+1]);
                que.push(cur->left);
            }
            // 当前节点的右节点
            if((idx*2+2 < nums.size()) && nums[idx*2+2] != -1){
                cur->right = new TreeNode(nums[idx*2+2]);
                que.push(cur->right);
            }
            ++idx;
        }
        cout << endl;
    }
    return root;
}
void travesal(TreeNode* root){
    queue<TreeNode*> que;
    if(root) que.push(root);
    while(!que.empty()){
        int len = que.size();
        for(size_t i=0; i< len;++i){
            auto cur = que.front();que.pop();
            cout << cur->val << " ";
            if(cur->left) que.push(cur->left);
            if(cur->right) que.push(cur->right);
        }
        cout << endl;
    }
}

string deleteSpace(string s){
    size_t l=0, r=0;
    for(; r < s.size(); ++r){
        if(s[r] != ' ') s[l++] = s[r];
    }
    return s.substr(0, l);
}

/*

[1,2,3,-1,4]
[1,2,3,-1,4,5,-1,-1, -1, 6]
[1, 2,3, 4,5]
*/
int main()
{

    // string input;
    // std::getline(cin, input);
    // input = deleteSpace(input);
    // input = input.substr(input.find_first_of('[') + 1, input.find_first_of(']') - input.find_first_of('[') - 1);
    // cout << input << endl;
    // stringstream ss(input);
    // string temp;
    // vector<int> nums;
    // while(getline(ss, temp, ',')){
    //     if(!temp.empty())
    //         nums.emplace_back(stoi(temp));
    // }


    // for(auto& n:nums){
    //     cout << n <<" ";
    // }
    // cout << endl;


    vector<int> nums{1,2,3,-1,4,5,-1,-1, -1, 6};
    // TreeNode* root = buildTree(nums);
    // TreeNode* root = buildTreeQueue(nums);
    TreeNode* root = buildTreeDFS(nums,0);
    
    travesal(root);
}


标签:right,TreeNode,nums,que,二叉树,数组,构建,root,left
From: https://www.cnblogs.com/xiaohuidi/p/17652833.html

相关文章

  • JS 给json数组新增对象
    varjsonstr="[{'name':'a','value':1},{'name':'b','value':2}]";varjsonarray=eval('('+jsonstr+')');vararr={"name":$('#names').val(),&qu......
  • Jenkins 构建完 直接把包推送到 GitHub
    思路:在本地生成密钥,然后把公钥传到GitHub,然后在Jenkins中配置git 命令,让Jenkins自己构建完,直接推送官网连接:GeneratinganewSSHkeyandaddingittothessh-agent-GitHubEnterpriseServer3.7Docs1、在本地生成密钥粘贴下面的文本,替换您的GitHub企业服务器电......
  • 如何使用图形数据库构建实时推荐引擎
    推荐:使用NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景“这是给你的”,“为你推荐的”或“你可能也喜欢”,是大多数数字业务中必不可少的短语,特别是在电子商务或流媒体平台中。尽管它们看起来像一个简单的概念,但它们暗示了企业与客户互动和联系方式的新时代:推荐时代。老实说......
  • slice 切片数组测试记录【GO 基础】
    〇、测试前准备本文是在GO环境下测试记录系列之一,GO基本环境部署步骤将略过,直接上代码。下面是常用命令:【初始化+运行+编译】//{GOPATH}环境变量值,example项目文件夹名称{GOPATH}\src\example>//运行代码//xxx.go为文件全名gorunxxx.go//初始化//重复......
  • day15 - 二叉树 part02
    102. 二叉树的层序遍历详解/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullp......
  • js 计算对象数组中某个字段sum之和
    1、一个字段之和要计算一个对象数组中某个字段的和,你可以使用JavaScript的Array.prototype.reduce()方法。reduce()方法对数组中的每个元素执行一个提供的函数,并将结果累积为单个值。以下是一个示例:假设你有一个对象数组 data,每个对象都有一个 value 字段,你想计算所有对......
  • swift学习笔记之---数组、字典、枚举、结构体
    1、数组-Arraylettypes=["none","warning","error"]//省略类型的数组声明letmenbers=[String]()//声明一个空数组menbers.append("six")//添加元素menbers+=["seven"]//添加元素menbers.insert("one"......
  • 数组的学习
    1.数组的定义:int[]arr=newint[]{1,2,3};简写为:int[]arr={1,2,3}; 2.数组地址值含义直接打印数组代表地址值,其中[代表数组的意思,I代表int类型数组,@代表固定搭配分隔符,B6d3589才是其真正地址 ......
  • [树状数组] 学习笔记
    原理intlowbit(intx){ returnx&(-x);}voidadd(intx,intk){ for(;x<=n;x+=lowbit(x))c[x]+=k;}intquery(intx){ intans=0; for(;x;x-=lowbit(x))ans+=c[x]; returnans;}单点修改+区间查询intlowbit(intx){ returnx&......
  • 在Mac系统上构建适用于Linux 64位的Go程序
    要在Mac系统上构建适用于Linux64位的Go程序,可以采用以下2种方式:1.通过设置环境变量并使用交叉编译来实现以下是在Mac系统上构建适用于Linux64位的Go程序的步骤:在你的项目根目录下,打开终端。设置环境变量GOOS和GOARCH为linux和amd64,分别表示目标操作系统为Linux,目......