链表和树这两中数据结构,不同于数组这种可以直接按索引访问的数据结构。链表和树通过每个基本单元内的指针,储存下一节点的位置。
链表的基本单元
C++实现:
struct Node{
int val;
Node* next;
Node(int x):val(x),next(nullptr){};//构造函数的初始化链表
};
Python实现:
Class Node:
def __init__(self,val,next_Node = None):
self.val = val
self.next_Node = next_Node
二叉树的基本单元类似:
struct TreeNode{
int val;
TreeNode* left;
TreeNode* Right;
TreeNode(int x):val(x),left(nullptr),right(nullptr){};
};
Python实现:
Class TreeNode:
def __init__(self,val,left_node= None, right_Node = None):
self.val = val
self.left = left_Node
self.right = right_Node
TreeNode(int x):val(x),left(nullptr),right(nullptr){}
实际上是一个构造函数的初始化列
表。它是C++中的特性,用于在构造对象时初始化其成员变量。这里的构造函数接受一个整型参数x
,并使用它来初始化成员变量val
,同时将left
和right
指针初始化为nullptr
,表示这两个子节点一开始是空的。
初始化列表的语法是在构造函数的参数列表后面加上一个冒号:
,然后列出要初始化的成员变量及其对应的初始值。在这个例子中,成员变量val
被初始化为传入的参数x
,而left
和right
则被初始化为nullptr
,表明它们一开始没有指向任何子节点。
使用初始化列表来初始化成员变量比在构造函数体内赋值更高效,因为初始化列表可以直接在对象的内存分配时初始化成员变量,避免了额外的赋值操作。这在涉及到复杂类型或类类型的成员变量时尤其重要,因为这些类型的默认构造函数和赋值操作可能会涉及更多的开销。
为链表和二叉树新增新成员
(一):Node手动赋值
//假设给了一个vector数组,让我们去初始化
#include <vector>
#include <iostream>
using namespace std;
struct Node{
int val;
Node* next;
Node(int x):val(x),next(nullptr){};//构造函数的初始化链表
};
int main(){
vector<int> Val{1,2,3,4,5};
Node*head = new Node(0);//初始化一个头结点
Node* pre = head;
Node* cur;
for(size_t i = 0;i< Val.size();i++){
cur = new Node(Val[i]);
pre->next = cur;
pre = cur;//移动pre,cur每次循环的时候移动了
}
Node *tmp = head;
head = head->next;
delete tmp;//删除虚拟头结点并清理空间;
//打印一下,看看能不能正常输出
while(head!=nullptr){
cout<<head->val<<endl;
head = head->next;
}
}
二叉树的手动赋值:
#include <iostream>
#include <vector>
using namespace std;
struct TreeNode{
int val;
TreeNode* left;
TreeNode* Right;
TreeNode(int x):val(x),left(nullptr),right(nullptr){};
TreeNode(int x,TreeNode* l,TreeNode* r):val(x),left(l),right(r){};
};
TreeNode* sortedArrayToBST(vector<int>& nums) {
return sortedArrayToBSTHelper(nums, 0, nums.size() - 1);
}
TreeNode* sortedArrayToBSTHelper(vector<int>& nums, int left, int right) {
if (left > right) return nullptr;
int mid = left + (right - left) / 2;
TreeNode* node = new TreeNode(nums[mid]);
node->left = sortedArrayToBSTHelper(nums, left, mid - 1);
node->right = sortedArrayToBSTHelper(nums, mid + 1, right);
return node;
}