一、指针
指针是一种编程概念,用于存储变量的内存地址;通过指针,程序能够直接访问和操作内存中的数据。
- 声明指针:声明一个指针变量,例如在C语言中,声明一个指向整数的指针
int *ptr;
- 指针赋值:将变量的地址赋给指针,例如
ptr = &variable;
,其中&
是取地址符,用来获取变量的内存地址。 - 空指针:指针可以初始化为
NULL
(或在C++中为nullptr
),表示它不指向任何有效的内存地址。 - 指针错误:指针的错误使用可能导致程序崩溃或数据损坏,如野指针、内存泄漏等。
#include <stdio.h>
//using namespace std;
int main()
{
int var = 10;
int* ptr;
ptr = &var;
if (ptr == nullptr)
{
fprintf(stderr, "错误:输出的指针是空指针\n");//错误流
return 1;
}
printf("Value of var: %d\n", var);
printf("Value pointed to by ptr : %d\n", *ptr);
return 0;
}
二、二叉树
在二叉树中,每个节点最多有两个子树,通常称为左子树和右子树。二叉树的节点通常包含一个数据元素以及两个指向其子树的链接(可能是空)。
1.二叉树类型:
- 满二叉树:所有层都被完全填满,每个节点都有0个或2个子节点。
- 完全二叉树:除了最后一层外,每一层都被完全填满,并且所有节点都向左对齐。
- 平衡二叉树:任何两个叶子节点的深度之差不超过1。
- 二叉搜索树(Binary Search Tree, BST):对于树中的每个节点,其左子树中的所有项都小于该节点,其右子树中的所有项都大于该节点。
2.二叉树遍历:按照某种规则访问树中的每个节点的过程
- 前序遍历:访问根节点 -> 遍历左子树 -> 遍历右子树
- 中序遍历:遍历左子树 -> 访问根节点 -> 遍历右子树
- 后序遍历:遍历左子树 -> 遍历右子树 -> 访问根节点
3.二叉树的实现
#include <stdio.h>
#include<iostream>
using namespace std;
struct TreeNode
{
int value; // 节点存储的值
TreeNode *left; // 指向左子节点的指针
TreeNode *right; // 指向右子节点的指针
// 构造函数,用于创建一个包含特定值的TreeNode对象
// 并且初始化左右子节点指针为nullptr
TreeNode(int x) :value(x), left(nullptr), right(nullptr) {}
};
int main()
{
TreeNode root(10);//节点值
//创建左节点
TreeNode leftchild(6);
root.left = &leftchild;
//创建右节点
TreeNode rightchild(12);
root.right = &rightchild;
//访问
cout << "roof value:" << root.value << endl;
cout << "left child value:" << root.left->value << endl;
cout << "right child value:" << root.right->value << endl;
}
三、构造算法逻辑图
四、代码
#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* insert(TreeNode* root, int val) {
if (root == nullptr) {
return new TreeNode(val);
}
if (val < root->val) {
root->left = insert(root->left, val);
}
else if (val > root->val) { // 确保如果val已经存在于树中,它将被插入在正确的位置
root->right = insert(root->right, val);
}
// 返回未修改的节点指针
return root;
}
// 前序遍历
void preorderTraversal(TreeNode* root) {
if (root != nullptr) {
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
// 中序遍历
void inorderTraversal(TreeNode* root) {
if (root != nullptr) {
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
}
// 后序遍历
void postorderTraversal(TreeNode* root) {
if (root != nullptr) {
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->val << " ";
}
}
int main() {
vector<int> values = { 20, 10, 30, 5, 15, 25, 35 };
TreeNode* root = nullptr;
for (int val : values) {
root = insert(root, val);
}
cout << "前序遍历: ";
preorderTraversal(root);
cout << endl;
cout << "中序遍历: ";
inorderTraversal(root);
cout << endl;
cout << "后序遍历: ";
postorderTraversal(root);
cout << endl;
return 0;
}