数据结构与算法——二叉树
一、相关概念 结点:根节、叶节点、分支结点、兄弟结点、父子结点 边、路径 结点深度、高度、层数 根节点为第 0 层 深度指从根节点到该节点的边的数量 高度指从此节点到叶节点的结点数量 满二叉树、完全二叉树 满二叉树指除了度为 0 的叶节点就是度为 2 的分支节点 完全二叉树指只有最下面的两层度是小于 2 的,且最下面的结点都集中在左侧 扩充二叉树 二叉树性质
一、相关概念 结点:根节、叶节点、分支结点、兄弟结点、父子结点 边、路径 结点深度、高度、层数 根节点为第 0 层 深度指从根节点到该节点的边的数量 高度指从此节点到叶节点的结点数量 满二叉树、完全二叉树 满二叉树指除了度为 0 的叶节点就是度为 2 的分支节点 完全二叉树指只有最下面的两层度是小于 2 的,且最下面的结点都集中在左侧 扩充二叉树 二叉树性质
模式串 next 向量计算: 字符串比较 int mystrcmp(const char* str1, const char* str2){ int i = 0; while(str1[i] == str2[i] && str1[i] != '\0'){ i++; } return str1[i] - str2[i]; }
void printArr(int *A, int size){ printf("Elements of array: "); for(int i = 0; i < size; ++i){ printf("%d\t", A[i]); } printf("\n"); } int main() { int C[3][2][2] = {{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}}; // 虽然地址相同,但代表的意义却不相同 printf("%p\t%p\t%p\t%p\t%p\t%p \n", C, *C, C[0], C[0][0], &C[0][0], &C[0][0][0]); printf("%p\t%p\t%p\n", *C+1, C[0]+1, C[0][1]); printf("%p\t%p\n", C, C[0][0] + 1); printf("%p\t%p\n", C, &C[0][0] + 1); // 分配空间,但不会对元素进行初始化 int *A = (int*)malloc(3 * sizeof(int)); for(int i = 0; i < 3; ++i){ A[i] = i+1; } printArr(A, 3); // 分配空间,并将元素初始化为0 int *B = (int*)calloc(3, sizeof(int)); printArr(B, 3); // 重新分配一块空间(新空间可大可小) // 并把原来的数据拷贝过来 // 如果新空间首地址与原来空间地址不同,会将原来的内存空间释放 // ,注意:此时不能再继续访问原来的地址,虽然原来的指针并未置空 int *D = (int*)realloc(A, 10 * sizeof(int)); printf("%p\t%p\n", A, D); printArr(A, 3); // 此时不能访问 A 了,这是危险的行为 printArr(D, 10); // 等同于重新分配了空间 D = (int*)realloc(NULL, 3 * sizeof(int)); // int *D = (int*)malloc(3 * sizeof(int)); printf("%p\t%p\n", A, D); printArr(D, 3); // 等同于释放了内存空间并将指针置为空值 D = (int*)realloc(D, 0); // free(D);D = nullptr; printf("%p\n", D); return 0; } 输出:...
描述 计算矩阵中,最大和的子矩阵,并输出最大的和 测试用例 用例一: $$\begin{equation} \begin{bmatrix*}[c] -3 & -5 & -1 & 5 \newline 2 & -4 & -2 & 4 \newline -1 & 3 & -1 & 3 \end{bmatrix*} \end{equation}$$ 用例二: $$\begin{equation} \begin{bmatrix*}[c] -3 & -5 & -1 & 5 \newline 9 & -4 & -2 & 4 \newline -1 & 3 & -1 & 3 \end{bmatrix*} \end{equation}$$ 用例三: $$\begin{equation} \begin{bmatrix*}[c] -3 & -5 & -1 & 5 \newline 7 & -4 & -2 & 4 \newline -1 & 3 & -1 & 3 \end{bmatrix*} \end{equation}$$...
方法一:使用字符串 注意 : 字符与字符相加返回的是一个整数 字符串与字符相加的问题: 可以使用 + 号运算符,但其中一个操作数需要是 string 类型 如果需要连续相加多个字符,前两个操作数必须有一个是 string 类型的 可以使用 string.append 方法 控制台输入字符串的问题,如果直接使用 cin >> str,遇到空格和回车都会终止读取 例如:在字符串 s 后面添加 ‘a’、‘b’、‘c’ 三个字符 参考 C++ 运算符优先级和结合性 string s; s = s + 'a' + 'b' + 'c'; // 正确 s += 'a' + 'b' + 'c'; // 错误 s = 'a' + 'b' + 'c' + s; // 错误 int main(){ string LR = "1625", FB = "3645", AC = "1324"; string mov; getline(cin, mov); for (char c : mov) { string tmp = ""; switch (c) { case 'L': case 'R': { if (c == 'L') { // LR = tmp + LR[3] + LR[0] + LR[1] + LR[2]; LR = LR[3] + string(LR, 0, 3); } else { // LR = tmp + LR[1] + LR[2] + LR[3] + LR[0]; LR = string(LR, 1, 3) + LR[0]; } // FB = tmp + FB[0] + LR[1] + FB[2] + LR[3]; FB[1] = LR[1]; FB[3] = LR[3]; // AC = tmp + LR[0] + AC[1] + LR[2] + AC[3]; AC[0] = LR[0]; AC[2] = LR[2]; break; } case 'F': case 'B': { if (c == 'F') { // FB = tmp + FB[3] + FB[0] + FB[1] + FB[2]; FB = FB[3] + string(FB, 0, 3); } else { // FB = tmp + FB[1] + FB[2] + FB[3] + FB[0]; FB = string(FB, 1, 3) + FB[0]; } // LR = tmp + LR[0] + FB[1] + LR[2] + FB[3]; LR[1] = FB[1]; LR[3] = FB[3]; // AC = tmp + AC[0] + FB[0] + AC[2] + FB[2]; AC[1] = FB[0]; AC[3] = FB[2]; break; } case 'A': case 'C': { if (c == 'A') { AC = tmp + AC[3] + AC[0] + AC[1] + AC[2]; } else { AC = tmp + AC[1] + AC[2] + AC[3] + AC[0]; } LR = tmp + AC[0] + LR[1] + AC[2] + LR[3]; FB = tmp + AC[1] + FB[1] + AC[3] + FB[3]; break; } default: break; } } cout << LR[0] << LR[2] << FB[0] << FB[2] << LR[3] << LR[1]; return 0; } 方法二:使用 deque 容器 int main() { //string LR = "1625", FB = "3645", AC = "1324"; deque<char> LR, FB, AC; LR....