C++学习记录-数据结构-求二叉树的高度
C++学习记录-数据结构-求二叉树的高度 123456789101112int findHeight(Node *p=root){ if (p == NULL) { return -1;//如果高度规定从1开始计数,则返回0 } else { return max(findHeight(p->left), findHeight(p->right)) + 1; //此处会算出当前节点的高度 }}//递归法实现求二叉树的高度
C++学习记录-数据结构-二叉搜索树删除节点
C++学习记录-数据结构-二叉搜索树删除节点 从二叉搜索树中删除节点,有三种可能的情况: 情况1:欲删除的节点是叶子节点:只需切断链接 情况2:欲删除的节点有一个子节点,则令其父节点的指针指向子节点 情况3:与删除的节点有两个子节点:另节点的值等于其右子树的最小值,再删除右子树的最小值 代码示例: 删除节点函数: 1234567891011121314151617181920212223242526272829303132333435363738394041424344Node* deletenode(Node* root,int value){ //第一步,找出节点 if (root == NULL) { return NULL; } else if (root->data > value) { root->left = deletenode(root->left, value); } //如果当前节点的值大于欲删除的值,左拐 else if (root->data <...
C++学习记录-数据结构-二叉树的遍历
C++学习记录-数据结构-二叉树的遍历 二叉树的层次遍历(宽度优先遍历) 利用队列的特性 123456789101112131415161718192021222324252627282930void BFS(){ Node* arr[100]; //创建一个队列数组存储节点的地址,可以使用STL里的队列 arr[0] = root; int head = 0; int tail = 1; //存入根节点,定义头尾 while (head != tail)//当头部不等于尾部的时候,即队列不为空时 { cout << arr[head]->data << " "; if (arr[head]->left != NULL) { arr[tail] = arr[head]->left; tail++; }//左孩入队 if (arr[head]->right !=...
C++学习记录-数据结构-二叉树的插入和查找数字
C++学习记录-数据结构-二叉树的插入和查找数字 迭代法实现插入 123456789101112131415161718192021222324252627282930313233343536373839404142434445void Insert(int num){ scanner = root;//首先保存一下根节点的地址 if (root == NULL)//如果根节点为空 { root = new Node; root->data = num;//new一个并赋值 scanner = root;//扫描指针重新定位到根节点 return; } else//如果根节点不为空 { while (true) { if (root->data >= num)//如果当前节点的数据大于等于欲插入的数据,则要左拐 { if (root->left != NULL) { root = root->left;...
C#学习记录-ref和out
C#学习记录-ref和out 两者都是对参数进行引用传递 ref参考: 关键字使参数按引用传递。其效果是,当控制权传递回调用方法时,在方法中对参数的任何更改都将反映在该变量中。若要使用 ref 参数,则方法定义和调用方法都必须显式使用 ref 关键字 out参考: out 关键字会导致参数通过引用来传递。这与 ref 关键字类似,不同之处在于 ref 要求变量必须在传递之前进行初始化。若要使用 out 参数,方法定义和调用方法都必须显式使用 out 关键字 示例: 12345678910111213141516171819202122232425262728293031323334353637383940using System;namespace ref和out练习{ class Program { void ChangeValue(int a) { a = 114514; } void ChangeValueWithRef(ref int a) ...
C++学习记录算法篇-快读与快写
C++学习记录算法篇-快读与快写 快读 1234567int read() { int x=0,f=1; char c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x*f;} 快写 12345void write(int x) { if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0');}
C++学习记录-数据结构-链表的两种反转
链表的两种反转 首先创建一个链表: 123456struct Node { int data; Node* next = NULL;};Node* head = NULL;//指向头部的指针 1.递归法反转链表 12345678910111213void reserve(Node *p){ if (p->next == NULL) { head = p; return; } reserve(p->next); p->next->next = p; p->next = NULL; return;}//链表的递归反转,开始时传入头指针head 2.迭代法反转链表 12345678910111213141516void reserveBydiedai(){ Node* prev = NULL; Node* now = head; Node* nex; while (now != NULL) { nex = now->next; now->next =...
C++学习记录-内建函数对象
C++学习记录-内建函数对象 概念: STL内建了一些函数对象 分类: 算术仿函数 关系仿函数 逻辑仿函数 用法: 这些仿函数所产生的对象,用法和一般函数完全相同 使用内建函数对象,需要引入头文件 1#include<functional> 算数仿函数 功能描述: 实现四则运算 其中negate是一元运算,其余的都是二元运算 函数: 返回类型即<>中定义的类型 T plus<T> //加法仿函数 T minus<T> //减法仿函数 T multiplies<T> //乘法仿函数 T divides<T> //除法仿函数 T modulus<T> //取模仿函数 T...
C++学习记录-谓词
C++学习记录-谓词 谓词 返回bool类型的仿函数称为谓词 如果operator()接受一个参数,那么叫做一元谓词 如果operator()接受两个参数,那么叫做二元谓词 一元谓词: 123456789101112131415161718192021222324252627282930313233343536373839404142//在vector中查找大于5的元素#include<iostream>#include<vector>#include<algorithm>using namespace std;class myfind{public: bool operator()(int val) { return val > 5; }//一元谓词};void fun(){ vector<int> v; for (int i = 0; i < 10; i++) { v.push_back(i); } ...
C++学习记录-函数对象
C++学习记录-函数对象 一、函数对象 一个函数对象,即一个重载了括号运算符()的对象,也叫函数符。利用该对象调用()时和普通的函数调用一般,因此也叫仿函数 函数对象的本质是一个类,而不是一个函数,使用时应该实例化成一个对象 函数对象在使用时可以像普通函数一样调用,可以有参数,可以有返回值 函数对象可以有自己的状态 函数对象可以作为参数传递 二、示例: 1.函数对象在使用时可以像普通函数一样调用,可以有参数,可以有返回值 12345678910111213141516171819202122232425class line {public: double length;public: line(double a) :length(a) {}};//一个line类class forspace {public: double operator()(const line& a) { return a.length * a.length; }};//构建仿函数int...





