建树建图方法:
1.邻接表建立:
int e[M],ne[M],h[N],idx;
// 如果是树的话,ne[]和e[]的大小也是N
// M代表边的数目,N代表点的数目
memset(h,-1,size of h);
// 这是对h的初始化赋值
void add(int a,int b){
//插入a->b
//插入的过程是插入在表头
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
//将这个过程想像成链表插入节点
/*head指向q,在表头插入p
p->val = x;
p->next = head;
head = p;
//只不过邻接表多了一个idx++,指向下一个的操作
*/
2.leetcode建树节点的数据结构
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) {}
};
vector<TreeNode*> nodes;
int main() {
// 读取节点数量 n
int n;
cin >> n;
// 读取每个节点的权值
vector<int> values(n);
for (int i = 0; i < n; ++i) {
cin >> values[i];
}
// 读取每个节点的左右孩子编号
vector<TreeNode*> nodes= vector<TreeNode*>(n);
for (int i = 0; i < n; ++i) {
TreeNode* node = new TreeNode(values[i]);
nodes[i] = node;
}
// 构建树结构
for (int i = 0; i < n; ++i) {
int left_child, right_child;
cin >> left_child >> right_child;
if (left_child != -1) {
nodes[i]->left = nodes[left_child - 1];
}
if (right_child != -1) {
nodes[i]->right = nodes[right_child - 1];
}
}
// 返回根节点
return nodes[0];
}