[BST的构建][C++实现]

今天前面碰到一题,判定给定的BST是否是合法的,因为BST性质,LDR遍历递增,根据这个来判定即可。但是碰到给定自行构建BST的时候,给定的输入是这样的:

5 1

5 2 3

1 0 0

3 4 5

4 0 0

6 0 0 

什么意思呢,第一行为n和root,分别代表总共n个节点,并且root节点为序号root的节点。

之后每一行输入的是三个数,分别为val,left_idx,right_idx来进行链接关系,如果碰到idx=0的,说明子节点为空

想了蛮久到底怎么样去构建这棵树比较好,感觉还是总结一下吧

#include 
using namespace std;

struct TreeNode{ //定义树节点
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x):val(x),left(NULL),right(NULL){}
};

void LDR(TreeNode* root,vector& res){
    if(!root){
        return;
    }
    LDR(root->left,res);
    res.push_back(root->val);
    LDR(root->right,res);
    return;
}
int main(){
    int n,root_idx; //总共n个点
    cin>>n>>root_idx;
    int val,left_idx,right_idx; //一行中的三个信息
    vector>> vec; //存每行的信息
    vector node; //存所有的node节点
    for(int i=0;i>val>>left_idx>>right_idx;
        node.push_back(new TreeNode(val)); //当前节点进行创建,之后进行相连即可
        vec.push_back({val,{left_idx-1,right_idx-1}}); //记住,给定的和实际的有差值1
    }
    TreeNode* root=node[0]; //这是最后的根节点
    for(int i=0;i0){ //如果左子节点是存在的,进行相连,之前一直判断这里错误了,因为1的差值,此时会出现-1,因此要判断>0
            node[i]->left=node[vec[i].second.first];
        }
        if(vec[i].second.second>0){
            node[i]->right=node[vec[i].second.second];
        }
    }
    //到目前为止已经创建成功,check一下,LDR观察一下
    vector res;
    LDR(root,res);
    cout<<"The LDR sequence is: ";
    for(int i=0;i

运行截图如下:

[BST的构建][C++实现]_第1张图片

你可能感兴趣的:(一些总结)