【数据结构】【王道】【树与二叉树】二叉树非递归遍历的实现(可直接运行)

王道课后代码大题---树与二叉树 一.二叉树的概念 1.求两结点的最近公共祖先结点(二叉树任意两个结点必然存在最近的公共祖先结点) 已知一颗二叉树按顺序存储结构进行存储,设计一个算法,求编号分别为i和j的两个结点的最近公共祖先结点 方法一 思想 最坏的情况是最近公共祖先结点为根节点,而且从最近的公共祖先结点到根节点的全部祖先结点都是公共的。由二叉树的顺序存储的性质可知,任意结点i的双亲结点的编号为i/2,求解i和j最近公共祖先结点的算法步骤如下(设从数组下标1开始存储) (1)若i>j,则结点i所在层次大于等于结点j所在层次。结 阅读详情

总目录:https://blog.youkuaiyun.com/treesorshining/article/details/125726400

1.说明

相比于递归实现的遍历算法,非递归算法增加了一个辅助栈,根据栈后进先出的特点,来实现非递归遍历。

2.算法实现

2.1 先序遍历(非递归)

如果结点不为空就先访问结点,然后将结点压入栈中;然后进行遍历,直至存在左孩子为NULL的结点为止;此时,由于是先访问,此左节点之上的双亲节点,双亲结点的双亲节点(如果有)以及访问完毕了,即是运用了传统先序遍历的根左右思想。 之后弹出栈顶结点,若其右孩子不为NULL则进入其右子树进行上述操作,直至某个结点有孩子为NULL为止, 若其右孩子为NULL则继续弹出栈顶结点,然后继续上述操作,直至退出循环为止。

// 先序遍历(非递归)
void PreOrder(BiTree T) {
    LinkStack S;
    // 初始化栈
    InitStack(S);
    // 遍历指针
    BiTree p = T;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {
        // 如果结点不为空就先访问结点,然后将结点压入栈中
        // 然后进行遍历,直至存在左孩子为NULL的结点为止
        // 此时,由于是先访问,此左节点之上的双亲节点,双亲结点的双亲节点(如果有)以及访问完毕了
        // 即是运用了传统先序遍历的根左右思想
        // 之后弹出栈顶结点
        // 若其右孩子不为NULL则进入其右子树进行上述操作,直至某个结点有孩子为NULL为止
        // 若其右孩子为NULL则继续弹出栈顶结点,然后继续上述操作,直至退出循环为止
        if(p) {
            visit(p);
            Push(S, p);
            p = p->lchild;
        } else {
            Pop(S, p);
            p = p->rchild;
        }
    }
}

2.2 中序遍历(非递归)

如果结点不为空,则先将结点压入栈中, 然后先遍历此结点下所有左孩子,直至某一个左孩子为NULL,然后弹出栈顶结点并访问,若其右孩子不为NULL则进入其右子树进行上述操作,直至某个结点有孩子为NULL为止,若其右孩子为NULL则继续弹出栈顶结点进行访问,然后继续上述操作,直至退出循环为止。思路即是中序遍历传统思路,先访问左节点,再访问根节点,最后访问右节点。

// 中序遍历(非递归)
void InOrder(BiTree T) {
    LinkStack S;
    // 初始化栈
    InitStack(S);
    // 遍历指针
    BiTree p = T;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {
        // 如果结点不为空,则先将结点压入栈中
        // 然后先遍历此结点下所有左孩子,直至某一个左孩子为NULL
        // 然后弹出栈顶结点并访问
        // 若其右孩子不为NULL则进入其右子树进行上述操作,直至某个结点有孩子为NULL为止
        // 若其右孩子为NULL则继续弹出栈顶结点进行访问,然后继续上述操作,直至退出循环为止
        // 思路即是中序遍历传统思路,先访问左节点,再访问根节点,最后访问右节点
        if(p) {
            Push(S, p);
            p = p->lchild;
        } else {
            Pop(S, p);
            visit(p);
            p = p->rchild;
        }
    }
}

2.3 后序遍历(非递归)

// 后序遍历(非递归)
void PostOrder(BiTree T) {
    LinkStack S;
    // 初始化栈
    InitStack(S);
    // 遍历指针
    BiTree p = T;
    // 辅助指针,用于记录最近访问过的结点
    BiTree r = NULL;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {
        // 如果结点不为空就先访问结点,然后将结点压入栈中
        // 然后进行遍历,直至存在左孩子为NULL的结点为止
        // 然后读取栈顶结点,如果其右孩子不为NULL且未被访问过,则以上述方法访问右子树
        // 否则栈顶结点出栈并进行访问
        // 此思路主要就是由于后序需要先访问完左右结点后才访问根结点
        // 所以不能类似于前序、中序一样,遍历到左子树最后一个左结点就可以开始出栈并访问
        // 访问完左子树后,不能直接出栈,而是要获取栈顶结点,对其右子树进行上述处理
        // 直至栈顶元素右子树为空或者右子树已经访问完毕,则可进行出栈访问
        if(p) {
            Push(S, p);
            p = p->lchild;
        } else {
            // 注意:此处是读取栈顶结点,而并非出栈
            GetTop(S, p);
            // 若右子树存在且未被访问过
            // 则以上述步骤开始访问其右子树
            // 否则,将栈顶结点出栈并访问
            if(p->rchild && p->rchild != r) {
                p = p->rchild;
            } else {
                Pop(S, p);
                visit(p);
                // 记录最近访问过的结点
                r = p;
                // 结点访问完成后,重置p指针
                // 由于每次出栈访问完一个结点就相当于遍历完以该结点为根的子树,所以需要将p重置
                p = NULL;
            }
        }
    }
}

2.4 后序遍历2(非递归)

可以以另一种较为巧妙的方式实现,可知后序遍历结果为左右根,先序遍历结果为根左右,可将先序遍历循环中左右全部互换,结果应为根右左,然后将结果全部取反,可得左右根,即后序遍历结果。但需要额外设立一个栈,增加了空间开销。

// 后序遍历(非递归)
// 可以以另一种较为巧妙的方式实现
// 可知后序遍历结果为左右根,先序遍历结果为根左右
// 可将先序遍历循环中左右全部互换,结果应为根右左
// 然后将结果全部取反,可得左右根,即后序遍历结果
// 但需要额外设立一个栈,增加了空间开销
void PostOrder1(BiTree T) {
    LinkStack S;
    // 额外设立一个辅助栈,用于存入将要输出结果的结点
    // 由于栈的特性,根右左输入,应有左右根的输出
    LinkStack temp;
    // 初始化栈
    InitStack(S);
    InitStack(temp);
    // 遍历指针
    BiTree p = T;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {
        if(p) {
            Push(temp, p);
            Push(S, p);
            p = p->rchild;
        } else {
            Pop(S, p);
            p = p->lchild;
        }
    }
    // 输出后序结果
    while(!IsEmpty(temp)) {
        Pop(temp, p);
        visit(p);
    }
}

3.完整代码

#include<stdio.h>
#include<stdlib.h>

typedef struct BiTNode {
    // 数据域
    char data;
    // 左、右孩子指针
    struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

// 不带头结点
typedef struct LinkNode {
    BiTNode* data;   // 数据域
    struct LinkNode *next; // 指针域
} LSNode, *LinkStack;   // 栈类型定义

// 初始化
void InitTree(BiTree &T) {
    // 初始化可将根节点置空,空树
    T = NULL;
    // 插入根节点
    // 分配空间
    T = (BiTree)malloc(sizeof(BiTree));
    // 赋值
    T->data = 'A';
    // 初始无左右子树
    T->lchild = NULL;
    T->rchild = NULL;
}

// 左插入结点
bool InsertLeftTreeNode(BiTNode* &T, char x) {
    // 分配空间
    BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->lchild = p;
    return true;
}

// 右插入结点
bool InsertRightTreeNode(BiTNode* &T, char x) {
    // 分配空间
    BiTNode *p = (BiTNode*)malloc(sizeof(BiTNode));
    // 分配空间失败的情况
    if(p == NULL) {
        return false;
    }
    // 数据域赋值
    p->data = x;
    // 初始插入,无左右孩子,置空
    p->lchild = NULL;
    p->rchild = NULL;
    // 作为指定插入结点的左孩子
    T->rchild = p;
    return true;
}

// 访问结点
void visit(BiTree T) {
    printf("%c   ", T->data);
}

// 树的深度
int treeDepth(BiTree T) {
    // 根结点为空,则深度为0
    if(T == NULL) {
        return 0;
    } else {
        // 递归遍历左子树,获得左子树深度
        int l = treeDepth(T->lchild);
        // 递归遍历右子树,获得右子树深度
        int r = treeDepth(T->rchild);
        // 树的深度=Max{左子树深度,右子树深度} + 1
        // 加1相当于访问根节点,包括根结点深度+1
        return l > r ? l + 1 : r + 1;
    }
}

// 初始化
void InitStack(LinkStack &S) {
    // 此为不带头结点的栈,与单链表相似,初始将栈顶指针指向NULL即可
    S = NULL;
}

// 判空
bool IsEmpty(LinkStack S) {
    // 栈为空的条件即栈顶指针指向NULL
    if(S == NULL) {
        return true;
    }
    return false;
}

// 入栈操作
// 由于栈只能从一端操作,所以每次都应该是从栈顶入栈
bool Push(LinkStack &S, BiTNode* e) {
    // 申请分配空间
    LSNode *s = (LSNode*)malloc(sizeof(LSNode));
    // 内存分配失败的情况
    if(s == NULL) {
        return false;
    }
    s->data = e;
    // 由于每次都是从栈顶指针处插入,所以无需特殊处理
    // 令s指向S之前指向的地址
    s->next = S;
    // 使头指针指向s
    S = s;
    return true;
}

// 出栈操作
// 类似于单链表的删除操作,不过只能在栈顶进行出栈
bool Pop(LinkStack &S, BiTNode* &e) {
    // 如果是空栈,则不可进行出栈操作
    if(S == NULL) {
        return false;
    }
    // 出栈结点即为栈顶指针指向的结点
    // 将出栈结点值赋给e
    e = S->data;
    // 临时结点,用于之后释放空间
    LSNode* p = S;
    // 使头指针指向下一个结点
    S = S->next;
    // 释放空间
    free(p);
    return true;
}

// 获取栈顶元素
bool GetTop(LinkStack S, BiTNode* &e) {
    // 栈为空的情况
    if(S == NULL) {
        return false;
    }
    e = S->data;
    return true;
}

// 先序遍历(非递归)
void PreOrder(BiTree T) {
    LinkStack S;
    // 初始化栈
    InitStack(S);
    // 遍历指针
    BiTree p = T;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {
        // 如果结点不为空就先访问结点,然后将结点压入栈中
        // 然后进行遍历,直至存在左孩子为NULL的结点为止
        // 此时,由于是先访问,此左节点之上的双亲节点,双亲结点的双亲节点(如果有)以及访问完毕了
        // 即是运用了传统先序遍历的根左右思想
        // 之后弹出栈顶结点
        // 若其右孩子不为NULL则进入其右子树进行上述操作,直至某个结点有孩子为NULL为止
        // 若其右孩子为NULL则继续弹出栈顶结点,然后继续上述操作,直至退出循环为止
        if(p) {
            visit(p);
            Push(S, p);
            p = p->lchild;
        } else {
            Pop(S, p);
            p = p->rchild;
        }
    }
}

// 中序遍历(非递归)
void InOrder(BiTree T) {
    LinkStack S;
    // 初始化栈
    InitStack(S);
    // 遍历指针
    BiTree p = T;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {
        // 如果结点不为空,则先将结点压入栈中
        // 然后先遍历此结点下所有左孩子,直至某一个左孩子为NULL
        // 然后弹出栈顶结点并访问
        // 若其右孩子不为NULL则进入其右子树进行上述操作,直至某个结点有孩子为NULL为止
        // 若其右孩子为NULL则继续弹出栈顶结点进行访问,然后继续上述操作,直至退出循环为止
        // 思路即是中序遍历传统思路,先访问左节点,再访问根节点,最后访问右节点
        if(p) {
            Push(S, p);
            p = p->lchild;
        } else {
            Pop(S, p);
            visit(p);
            p = p->rchild;
        }
    }
}

// 后序遍历(非递归)
void PostOrder(BiTree T) {
    LinkStack S;
    // 初始化栈
    InitStack(S);
    // 遍历指针
    BiTree p = T;
    // 辅助指针,用于记录最近访问过的结点
    BiTree r = NULL;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {
        // 如果结点不为空就先访问结点,然后将结点压入栈中
        // 然后进行遍历,直至存在左孩子为NULL的结点为止
        // 然后读取栈顶结点,如果其右孩子不为NULL且未被访问过,则以上述方法访问右子树
        // 否则栈顶结点出栈并进行访问
        // 此思路主要就是由于后序需要先访问完左右结点后才访问根结点
        // 所以不能类似于前序、中序一样,遍历到左子树最后一个左结点就可以开始出栈并访问
        // 访问完左子树后,不能直接出栈,而是要获取栈顶结点,对其右子树进行上述处理
        // 直至栈顶元素右子树为空或者右子树已经访问完毕,则可进行出栈访问
        if(p) {
            Push(S, p);
            p = p->lchild;
        } else {
            // 注意:此处是读取栈顶结点,而并非出栈
            GetTop(S, p);
            // 若右子树存在且未被访问过
            // 则以上述步骤开始访问其右子树
            // 否则,将栈顶结点出栈并访问
            if(p->rchild && p->rchild != r) {
                p = p->rchild;
            } else {
                Pop(S, p);
                visit(p);
                // 记录最近访问过的结点
                r = p;
                // 结点访问完成后,重置p指针
                // 由于每次出栈访问完一个结点就相当于遍历完以该结点为根的子树,所以需要将p重置
                p = NULL;
            }
        }
    }
}

// 后序遍历(非递归)
// 可以以另一种较为巧妙的方式实现
// 可知后序遍历结果为左右根,先序遍历结果为根左右
// 可将先序遍历循环中左右全部互换,结果应为根右左
// 然后将结果全部取反,可得左右根,即后序遍历结果
// 但需要额外设立一个栈,增加了空间开销
void PostOrder1(BiTree T) {
    LinkStack S;
    // 额外设立一个辅助栈,用于存入将要输出结果的结点
    // 由于栈的特性,根右左输入,应有左右根的输出
    LinkStack temp;
    // 初始化栈
    InitStack(S);
    InitStack(temp);
    // 遍历指针
    BiTree p = T;
    // 树和链表有一者不为空则循环继续进行
    while(p || !IsEmpty(S)) {
        if(p) {
            Push(temp, p);
            Push(S, p);
            p = p->rchild;
        } else {
            Pop(S, p);
            p = p->lchild;
        }
    }
    // 输出后序结果
    while(!IsEmpty(temp)) {
        Pop(temp, p);
        visit(p);
    }
}

int main() {
    BiTree T;
    InitTree(T);
    InsertLeftTreeNode(T, 'B');
    InsertRightTreeNode(T, 'C');
    InsertLeftTreeNode(T->lchild, 'D');
    InsertRightTreeNode(T->lchild, 'E');
    InsertLeftTreeNode(T->rchild, 'F');
    InsertRightTreeNode(T->rchild, 'G');
    printf("PreOrder\n");
    PreOrder(T);
    printf("\nInOrder\n");
    InOrder(T);
    printf("\nPostOrder\n");
    PostOrder(T);
    printf("\ntreeDepth:%d\n", treeDepth(T));
}

4.运行结果

在这里插入图片描述

【2023王道数据结构】【树与二叉树】通过C++实现后序遍历的非递归算法(手动入出栈)C、C++完整实现(可直接运行 🌜笔锋至此又怎能平淡而终,故事开始便不承认普通🌛 📌 题目及题解持续更新中 👀👀👀 【2023王道数据结构目录】课后算法设计题C、C++代码实现完整版大全 题目: 通过C++实现后序遍历的非递归算法(手动入出栈) 运行截图: 代码实现: #include <iostream> #include <stack> using namespace std; //创建树结点 typedef struct BiTNode { char data; struct. 阅读详情

相关推荐

【2023王道数据结构】【树与二叉树】通过C++实现中序遍历的非递归算法(手动入出栈)C、C++完整实现(可直接运行

🌜笔锋至此又怎能平淡而终,故事开始便不承认普通🌛 📌 题目及题解持续更新中 👀👀👀 【2023王道数据结构目录】课后算法设计题C、C++代码实现完整版大全 题目: 通过C++实现中序遍历的非递归算法(手动入出栈) 运行截图: 代码实现: #include <iostream> #include <stack> using namespace std; //创建树结点 typedef struct BiTNode { char data; struct.

优快云 精品推荐 531

后序遍历非递归实现(转载)

后序遍历的非递归实现是三种遍历方式中最难的一种。因为在后序遍历中,要保证左孩子和右孩子都已被访问并且左孩子在右孩子前访问才能访问根结点,这就为流程的控制带来了难题。下面介绍两种思路。 第一种思路:对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问, 因此其右孩子还为被访问。所以接下来按照相同的...

little5programmer的博客 1万+

【2023王道数据结构】【树与二叉树】通过C++实现先序遍历的非递归算法(手动入出栈)栈顶保存当前结点的左子树C、C++完整实现(可直接运行)

🌜笔锋至此又怎能平淡而终,故事开始便不承认普通🌛 📌 题目及题解持续更新中 👀👀👀 【2023王道数据结构目录】课后算法设计题C、C++代码实现完整版大全 题目: 通过C++实现先序遍历的非递归算法(手动入出栈)栈顶保存当前结点的左子树 运行截图: 代码实现: #include <iostream> #include <stack> using namespace std; //创建树结点 typedef struct BiTNode { char data.

优快云 精品推荐 493

王道考研 ++++ 二叉树的非递归遍历(先序、中序、后序)

非递归 #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MaxSize 100 typedef struct LTree { char data; struct LTree *LChild,*RChild; }LTree,*BiTree; typedef s...

eacape 1896

【2025王道数据结构】王道数据结构课后代码题汇总答案C、C++代码实现完整版大全(可直接运行)

下面内容是本人在复习王道数据结构的过程中, 对一些算法设计题目的全部实现(答案解析全部都是伪码或者函数的部分实现,不可调试运行),不一定是最优的, 但是都能保证端到端测试运行,本文会陆陆续续更新,个人水平有限,可能文章里面存在一些问题,还望各位多多指点。   加油,阿光!!!我看好你哦😋😋😋 以下摘自王道2023年数据结构考研复习指导题目 文章目录 😉第2章:线性表 ✌18页综合应用题 题号 题解链接 1 传送门 2 传送门 3 传送门 4 传送门 5 传送.

优快云 精品推荐 1万+

IBM V3700更换控制器2(503错误)

正常的node1 ,机器代码版本:7.5.0.3, 机器代码构建:115.51.1509171734000。耐心等待后,刷新,看到node2,状态变成 节点状态:服务,错误:656,版本和node1一样了。新换的node2 ,机器代码版本:7.2.0.5, 机器代码构建:87.8.1404221000。耐心等待,刷新,node2,状态看到了,节点状态:活动,错误 724 1 1 0。拔出故障的控制,把内存和HBA卡,电池换到新的控制器。新的控制还是报错无法使用,节点状态:服务 错误:503。

klyshao的博客 4447

二叉树的先序、中序、后序非递归遍历

先序遍历非递归: void PreOrder_NonRecursion(TNode* &T) { Stack S; InitStack(S); if(T!=NULL) { Push(S,T); } while(StackEmpty(S)!=true) { Pop(S,T); visit(...

qq_34941153的博客 536

Linux系统遭遇挖矿病毒深度排查与根治指南

本文提供了一份详尽的Linux服务器挖矿病毒排查与根治指南。当CPU异常满载但常规top命令无法定位进程时,需警惕病毒通过ld.so.preload文件隐藏。文章逐步指导如何清除恶意文件、进程、定时任务,并重点应对pamdicks等顽固变种,最后给出深度排查与系统加固方案,确保服务器安全。

weixin_29207533的博客 452

23王道——二叉树的层次遍历

层次遍历C++

下次再说的博客 1673

硬件工程师入门进阶,一文搞懂,看这篇就对了

每家公司的datasheet都有严格的规范,及独特的风格,有时候还会穿插一些原理性的介绍,比如ADI公司的一些ADC/DAC器件资料里面,还会包含AD/DA转换的原理性讲解内容,Datasheet既可以是我们设计上的好帮手,也是学习的好资料。在出货量大的产品中,尽量减少物料种类,比如开头说的,1%的电阻不得不用,那么5%的替换成1%的,物料种类就减少一种,量就大了,能不能争取更优的价格呢?如果说前面学的是内功,那这一关,是招式、是工具的使用,原理图和PCB设计都有对应的工具,教程也很多,且比较容易上手。

一路带飞的博客 5万+

Dify沙箱权限配置实战:解决‘operation not permitted‘报错的完整指南

本文详细解析了Dify平台中常见的'operation not permitted'报错根源,即沙箱安全机制对系统调用的限制。通过实战步骤,指导用户定位并修改config.yaml配置文件,精准配置allowed_syscalls白名单以解决权限问题,涵盖从文件操作、进程控制到网络通信等关键系统调用的编号详解与配置示例,帮助用户在保障安全的前提下,顺利运行依赖特定库的代码工作流。

tech5的博客 1202

2023王道C语言训练营(二叉树的层次建树以及前、中、后序遍历)

2023王道C语言训练营(二叉树的层次建树以及前、中、后序遍历)

m0_51195865的博客 600

任务混部最少服务器数量计算问题

这里的并行度指的是该任务运行时会占用的服务器数量。要注意的是,一个服务器在每个时刻可以被任意任务使用,但同一时刻最多只能被一个任务占用,并且任务运行结束后会立即释放服务器(结束时刻不占用)。最后,我们从字典中找出服务器数量的最大值,这个最大值就是完成这批任务混部最少需要的服务器数量。对于每个任务,我们会遍历其对应的时间区间,将该任务的并行度累加到对应时刻的服务器数量上。任务混部的目标是让这批任务由同一批服务器承载运行,你需要计算完成这批任务混部最少需要多少服务器,以此来最大化控制资源成本。

m0_62153576的博客 106

【数据结构】二叉树之非递归遍历

本篇使用例题图解二叉树链式结构的非递归前、中、后序遍历。o(* ̄▽ ̄*)ブ

阿琪 2423

构建OneService:打造高效、安全、灵活的企业级数据服务平台

数据服务(OneService)作为统一的数据服务出口,实现了数据的统一市场化管理,有效地降低数据开放门槛的同时,保障了数据开放的安全。

数据与算法架构提升之路专栏 2106

【安全机制分析案例】从PDF预览页面提取原始PDF文件的方法原理与实践 篇二:基于致远互联(Seeyon)封装的SuwellLightRead技术

该HTML代码片段展示了致远OA协同办公系统的前端页面结构,包含多个CSS样式表和JavaScript文件的引用。页面设置了IE兼容模式,加载了全局环境变量、UI组件库和公告模块相关资源。代码中定义了系统路径、静态资源后缀等全局变量,并包含公告查看功能的相关配置参数。页面还引用了水印、文档处理、即时通讯等功能的JS文件,并设置了文件下载框架。整体呈现了一个典型的OA系统前端实现方案,包含浏览器兼容处理、资源加载和功能模块初始化等逻辑。

生活在别处 2074

《王道》数据结构代码实现与笔记

陆续更新至2022年12月底。 这篇Blog,简单的做个学王道数据结构的笔记,为了以后能快速回顾,笔记做得不好,见谅。 文章目录一、线性表1.顺序表的顺序表示1.1顺序表-静态数组1.2顺序表-动态数组2.顺序表的链式表示2.1单链表-带头结点2.2单链表-不带头结点 一、线性表 1.顺序表的顺序表示 1.1顺序表-静态数组 静态分配,大小不可改变 #include <stdio.h> #define MaxSize 10 // 定义最大长度 typedef struct { int

qq_34060370的博客 7975

LDO 上电过冲的根因

LDO在上电瞬间常出现短时过冲电压(3.4V-3.5V),可能损坏敏感器件。其根本原因是:低

硬核科技 292

王道数据结构【二叉树】部分代码实现(C语言)

王道数据结构【二叉树】部分代码实现(C语言)

年少的勇气已经用完,剩下的就是三思而后行 2308

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

二叉树三种非递归遍历

二叉树三种非递归遍历王道书思想方法实现

qq_52526050的博客 3394

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【数据结构】【王道】【数据结构实现】文章目录

数据结构实现文章目录

treesorshining的博客 1914

王道视频-数据结构-笔记5:树与二叉树

树是n(n≥0)个结点的有限集合。

我是一只小嵩鼠 1139

王道数据结构5(树与二叉树)

特点:①每个结点至多只有两棵子树 ②左右子树不能颠倒(二叉树是有序树)二叉树(Binary tree )是n(n≥0)个结点的有限集合。若n=0时称为空树,否则:(1)有且只有一个特殊的称为树的根(Root)结点;(2)若n>1时,其余的结点被分成为二个互不相交的子集TTT1,TTT2,分别称之为左、右子树,并且左、右子树又都是二叉树。由此可知,二叉树的定义是递归的。特点:二叉树结构简单,存储效率高,树的操作算法相对简单,且任何树都很容易转化成二叉树。...............

沉晨尘宸的博客 2061

数据结构05:树与二叉树[C++][树:双亲、孩子、兄弟表示法][二叉树:先序、中序、后序遍历]

考研笔记整理约4.0w字,小白友好、代码可跑的笔记整理,请小伙伴放心食用~🥝🥝

weixin_42789937的博客 4695

4.3二叉树的非递归中序遍历输出王道数据结构例程实现

王道二叉树的非递归中序遍历输出代码 #include <stdio.h> #include <stdlib.h> #define MaxSize 50 typedef int ElemType; typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild; } BiTNode...

dai_tou_dage的博客 395

【数据结构】24王道考研笔记——树与二叉树

【数据结构】24王道考研笔记——树与二叉树

weixin_51630192的博客 1276
上一篇: 【数据结构】【王道】【树与二叉树】二叉树层序遍历实现(可直接运行)
下一篇: 【数据结构】【王道】【树与二叉树】中序二叉线索树的实现及基本操作(可直接运行)
Silver  Star
Silver Star 新星创作者: 大数据技术领域 新星创作者: 大数据技术领域
博客等级 码龄7年 1万+粉丝 72原创
评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silver Star

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值