链表和树结构分析和基本操作

链表和树这两中数据结构,不同于数组这种可以直接按索引访问的数据结构。链表和树通过每个基本单元内的指针,储存下一节点的位置。

链表的基本单元

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,同时将leftright指针初始化为nullptr,表示这两个子节点一开始是空的。

初始化列表的语法是在构造函数的参数列表后面加上一个冒号:,然后列出要初始化的成员变量及其对应的初始值。在这个例子中,成员变量val被初始化为传入的参数x,而leftright则被初始化为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;
}

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值