《数据结构》树和二叉树代码整理(C语言实现)

数据结构(C语言版)--期末考试整理 第一章 数据结构概述 基本概念与术语 1. 数据:数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被 计算机程序所处理的符号的总称。 2. 数据元素:数据元素是数据的基本单位,是数据这个集合中的个体,也称之为元素,结点,顶点记录。 (补充:一个数据元素可由若干个 数据项组成。数据项是数据的不可分割的最小单位。) 3.数据对象:数据对象是具有相同性质的数据元素的集合,是数据的一个子集。(有时候也 叫做属性。) 4. 数据结构:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。 (1 阅读详情

目录

前言:

先序创建二叉树

二叉树遍历(前|中|后 序)--递归(核心代码)

二叉树遍历(前|中|后|层 序)--非递归(核心代码)

后序 双栈法

点这里有个C++ 版,方法很多,只会C的话应该能看懂思路

点这里有思路清晰的C语言版本

点这里有个后续遍历的不错思路——节点里增加了一个变量记录次数(或者用哈希表也可以)

求二叉树高度

按树状打印二叉树

输出二叉树叶子节点并统计叶子节点的数目

哈夫曼树(编码)

二叉搜索树--递归--插入,删除,和查找

二叉搜索树--非递归--插入、删除和查找

 由前序中序重建二叉树

 由中序后序重建二叉树

【Morris_Traversal】二叉树遍历(前|中|后 序)--非递归--不用栈--(完整代码)

前言:

排版很难看,没办法,主要是因为。。。。。。算了不解释了我就是懒。


先序创建二叉树

(这里用了C++  <引用>的特性,使用二重指针代替或者将函数返回值设成指针再做点小修改也能实现)

void CreateTree(TreeRoot &Root)
{//创建(先序)
    char c;
    c=getchar();
    if(c!='#')
    {
        Root=(TreeRoot)malloc(sizeof(TNode));
        Root->data=c;
        CreateTree(Root->pleft);
        CreateTree(Root->pright);
    }
    else
    {
        Root=NULL;
    }
}

二叉树遍历(前|中|后 序)--递归(核心代码)

void InorderTraversal( BinTree BT )
{
    if( BT ) {
        InorderTraversal( BT->Left );
        /* 此处假设对BT结点的访问就是打印数据 */
        printf("%d ", BT->Data); /* 假设数据为整型 */
        InorderTraversal( BT->Right );
    }
}

void PreorderTraversal( BinTree BT )
{
    if( BT ) {
        printf("%d ", BT->Data );
        PreorderTraversal( BT->Left );
        PreorderTraversal( BT->Right );
    }
}

void PostorderTraversal( BinTree BT )
{
    if( BT ) {
        PostorderTraversal( BT->Left );
        PostorderTraversal( BT->Right );
        printf("%d ", BT->Data);
    }
}

————————————————
版权声明:本文为优快云博主「BrianOne」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/Brianone/article/details/89440024

二叉树遍历(前|中|后|层 序)--非递归(核心代码)

void PreOrderFDG(TreeRoot Root)
{//先序遍历非递归
    SqStack S;
    InitStack(S);
    while(Root!=NULL || Empty(S)==0)
    {
        if(Root!=NULL)
        {
            printf("%c ",Root->data);
            Push(S,Root);
            Root=Root->pleft;
        }
        else
        {
            Pop(S,Root);
            Root=Root->pright;
        }
    }
}
void InOrderFDG(TreeRoot Root)
{//中序遍历非递归
    SqStack S;
    InitStack(S);
    while(Root!=NULL || Empty(S)==0)
    {
        if(Root!=NULL)
        {
            Push(S,Root);
            Root=Root->pleft;
        }
        else
        {
            Pop(S,Root);
            printf("%c ",Root->data);
            Root=Root->pright;
        }
    }
}
//后序遍历非递归算法
typedef struct SNode{
    BiTree p;
    int tag;
}SNode;
//后序遍历使用的进栈函数
void postpush(SNode *a,SNode sdata){
    a[++top]=sdata;
}
//后序遍历函数
void PostOrderTraverse(BiTree Tree){
    SNode a[20];//定义一个顺序栈
    BiTNode * p;//临时指针
    int tag;
    SNode sdata;
    p=Tree;
    while (p||top!=-1) {
        while (p) {
            //为该结点入栈做准备
            sdata.p=p;
            sdata.tag=0;//由于遍历是左孩子,设置标志位为0
            postpush(a, sdata);//压栈
            p=p->lchild;//以该结点为根结点,遍历左孩子
        }
        sdata=a[top];//取栈顶元素
        pop();//栈顶元素弹栈
        p=sdata.p;
        tag=sdata.tag;
        //如果tag==0,说明该结点还没有遍历它的右孩子
        if (tag==0) {
            sdata.p=p;
            sdata.tag=1;
            postpush(a, sdata);//更改该结点的标志位,重新压栈
            p=p->rchild;//以该结点的右孩子为根结点,重复循环
        }
        //如果取出来的栈顶元素的tag==1,说明此结点左右子树都遍历完了,可以调用操作函数了
        else{
            displayElem(p);
            p=NULL;
        }
    }
}

后序 双栈法

void NotRecursionPostOrder(BTree T){
  PLinkStack S,CS;
  S=Init_Stack();
  CS=Init_Stack();
  while(T || !empty_Stack(S)){
    if(T){
      Push_Stack(S,T);
      Push_Stack(CS,T);
      T=T->right;
    }else{
      T=Pop_Stack(S)->data;
      T=T->left;
    }
  }
  while(CS->top!=NULL){
    printf("%c",CS->top->data->element);
    CS->top=CS->top->next;
  }
  DestroyStack(CS);
}
void LevelorderTraversal ( BinTree BT )//层序遍历
{
    Queue Q;
    BinTree T;

    if ( !BT ) return; /* 若是空树则直接返回 */

    Q = CreatQueue(); /* 创建空队列Q */
    AddQ( Q, BT );
    while ( !IsEmpty(Q) ) {
        T = DeleteQ( Q );
        printf("%d ", T->Data); /* 访问取出队列的结点 */
        if ( T->Left )   AddQ( Q, T->Left );
        if ( T->Right )  AddQ( Q, T->Right );
    }

————————————————
版权声明:本文为优快云博主「BrianOne」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/Brianone/article/details/89440024

点这里有个C++ 版,方法很多,只会C的话应该能看懂思路

点这里有思路清晰的C语言版本

点这里有个后续遍历的不错思路——节点里增加了一个变量记录次数(或者用哈希表也可以)

后序遍历方法挺多,多搜一搜,特别是C++ 代码最好也能看看,有很多优秀的实现都是c++版的。

求二叉树高度

int PostTreeDepth(TreeRoot Root)
{//求二叉树的高度
    int hl,hr,max;
    if(Root!=NULL)
    {
        hl=PostTreeDepth(Root->pleft);
        hr=PostTreeDepth(Root->pright);
        max=hl>hr?hl:hr;
        return max+1;
    }
    else
        return 0;
}

按树状打印二叉树

void PrintTree(TreeRoot Root,int nLayer)
{//按树状打印二叉树
    int i;
    if(Root==NULL)
        return ;
    PrintTree(Root->pright,nLayer+1);
    for(i=0;i<=nLayer;i++)
    {
        printf("  ");
    }
    printf("%c\n",Root->data);
    PrintTree(Root->pleft,nLayer+1);
}

输出二叉树叶子节点并统计叶子节点的数目

void PreOrderLeaf(TreeRoot Root)
{//输出二叉树的叶子结点,并统计叶子结点的数目
    if(Root!=NULL)
    {
        if(Root->pleft==NULL && Root->pright==NULL)
        {
            printf("%c ",Root->data);
            leafcount++;
        }
        PreOrderLeaf(Root->pleft);
        PreOrderLeaf(Root->pright);
    }
}

哈夫曼树(编码)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct hfNode {
    int weight;
    struct hfNode* lch, * rch, * pnt;
}hfNode;

void selMin(hfNode* nodes, int n, int* a, int* b) { //求两个最小值的下标
    int temp[3] = { 0x3f3f3f3f,0x3f3f3f3f,0x3f3f3f3f };
    int i;
    for (i = 0; i < n; ++i) {
        //printf("%d,%d;", temp[1], temp[2]);
        if (nodes[i].pnt == 0) {
            int t = nodes[i].weight;
            if (temp[1] == 0x3f3f3f3f) {
                temp[1] = t;
                *a = i;
            }
            else if (temp[2] == 0x3f3f3f3f) {
                temp[2] = t;
                *b = i;
            }
            else if (temp[1] > t) {
                temp[1] = t;
                *a = i;
            }
            else if (temp[2] > t) {
                temp[2] = t;
                *b = i;
            }
        }
        //printf("%d,%d;\n", temp[1], temp[2]);
    }
}

void CreateTree(hfNode* nodes, char** hfCode, int* w, int n) {  //构造 Huffman Tree   规定向左走则生成0  右 1
    int m = 2 * n - 1;
    int j;
    int len;
    char* helper = (char*)malloc(2 * n * sizeof(char));

    for (int i = n; i < m; ++i) {
        int a, b;
        selMin(nodes, m, &a, &b);
        nodes[i].pnt = 0;
        nodes[i].lch = &nodes[a];
        nodes[i].rch = &nodes[b];
        nodes[a].pnt = &nodes[i];
        nodes[b].pnt = &nodes[i];
        nodes[i].weight = nodes[a].weight + nodes[b].weight;
    }
    //树建立完毕 下面开始生成哈夫曼码
    for (int i = 0; i < n; ++i) {
        hfNode* cur = nodes + i;
        j = 0;
        while (cur->pnt != 0) {
            hfNode* p = cur->pnt;
            if (p->lch == cur) {
                helper[j++] = '0';
            }
            else {
                helper[j++] = '1';
            }
            cur = cur->pnt;
        }
        hfCode[i] = (char*)malloc(sizeof(char) * (j + 1));
        len = 0;
        while (j > 0) {
            hfCode[i][len++] = helper[--j];
        }
        hfCode[i][len] = '\0';
    }
    free(helper);
}
void show(char** hfCode, int n) {
    //int n;
    int i;
    printf("\n按照输入顺序   哈夫曼编码依次为:\n");
    //printf("%d,%d\n", sizeof(hfCode) , sizeof(char*));
    //n = sizeof(hfCode) / sizeof(char*);
    for (i = 0; i < n; ++i) {
        printf("%s\n", hfCode[i]);
    }
    printf("\n================================\n");
}
void main() {
    hfNode* nodes;
    char** hfCode;
    int n;
    int* w;
    int i;
    printf("请输入字符数量:\n");
    scanf("%d", &n);
    w = (int*)malloc(n * sizeof(char*));
    hfCode = (char**)malloc(n * sizeof(char*));
    nodes = (hfNode*)malloc((2 * n - 1) * sizeof(hfNode));
    printf("请依次输入字符权重:\n");
    for (i = 0; i < n; ++i) {
        scanf("%d", w + i);
        (nodes + i)->weight = w[i];
        (nodes + i)->lch = (nodes + i)->rch = (nodes + i)->pnt = 0;
    }
    CreateTree(nodes, hfCode, w, n);
    show(hfCode, n);
    printf("%p,%p", (nodes + 1)->pnt, (nodes + 3)->pnt);
    free(w);
    free(nodes);
    free(hfCode);

}
/*
A  B  C  D
3  1  2  1
应该的编码之一应该为:

0
101
11
100
*/

二叉搜索树--递归--插入,删除,和查找

//二叉查找树   递归实现  插入,删除和查找
#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
    int val;
    struct Node* left;
    struct Node* right;
}Node;
typedef int bool;

Node * Find(Node* root,int a);   //如果找到了返回指针 如果找不到则返回空指针
Node *Insert(Node* root, int a);  //将a插入到root中并且返回根节点指针
Node *Delete(Node* root,int a);   //将a从root中删除并且返回根节点指针
Node* FindMin(Node* root);//找到最小节点并且返回该节点的指针
Node* FindMax(Node* root);//找到最大节点并且返回该节点的指针
void PreorderTraversal(Node* root); //先序遍历
int main(){
    Node* root = (Node*)malloc(sizeof(Node));//根节点
    Node * BST, *MinP, *MaxP, *Tmp;   //分别是树根节点   最小节点 最大节点 和一个临时用的节点指针变量
    int X;
    int N, i;
    BST = NULL;
    scanf("%d", &N);//插入节点
    for (i = 0; i < N; i++) {
        scanf("%d", &X);
        BST = Insert(BST, X);
    }
    printf("Preorder:"); PreorderTraversal(BST); printf("\n");//先序遍历
    MinP = FindMin(BST);
    MaxP = FindMax(BST);
    scanf("%d", &N);//查找节点
    for (i = 0; i < N; i++) {
        scanf("%d", &X);
        Tmp = Find(BST, X);
        if (Tmp == NULL) printf("%d is not found\n", X);
        else {
            printf("%d is found\n", Tmp->val);
            if (Tmp == MinP) printf("%d is the smallest key\n", Tmp->val);
            if (Tmp == MaxP) printf("%d is the largest key\n", Tmp->val);
        }
    }
    scanf("%d", &N);//删除节点
    for (i = 0; i < N; i++) {
        scanf("%d", &X);
        BST = Delete(BST, X);
    }
    printf("Preorder:"); PreorderTraversal(BST); printf("\n");//先序遍历
    return 0;
}

Node *Find(Node* root,int a) { //查找
    if (!root) return NULL;
    if (a == root->val) {
        return root;
    }
    else if (a > root->val) {
        return Find(root->right, a);
    }
    else {//a< root->val
        return Find(root->left, a);
    }
    return NULL;//实际上这一行是没有必要的
}
Node *Insert(Node* root, int a) {
    if (!root) {
        Node* newNode = (Node*)malloc(sizeof(Node));
        newNode->val = a;
        newNode->left = newNode->right = NULL;
        return newNode;
    }
    else if (a > root->val) {
        root->right = Insert(root->right, a);
    }
    else if (a < root->val) {
        root->left = Insert(root->left, a);
    }
    else {
        //这时候root的节点值等于a则不处理
    }
    return root;
}
Node* Delete(Node* root, int a) {
    if (!root) return root;
    if (a < root->val)       root->left = Delete(root->left, a);
    else if(a > root->val)   root->right = Delete(root->right, a);
    else{  //找到这个节点  那么进行删除操作  此刻要考虑四种情况:左右空 左右非空 左空右非空 左非空右空
        if (!root->left) { Node* temp = root; root = root->right; free(temp); }
        else if (!root->right) { Node* temp = root; root = root->left;free(temp); }
        else {
            Node* temp = root->right;
            while (temp->left) {
                temp = temp->left;
            }
            temp->left = root->left;
            root = root->right;
        }
    }
    return root;//这一句实际上没有必要
}
Node* FindMin(Node* root) {
    if (!root) {
        return NULL;
    }
    if (!root->left) {
        return root;
    }
    return FindMin(root->left);
}
Node* FindMax(Node* root) {
    if (!root) {
        return NULL;
    }
    if (!root->right) {
        return root;
    }
    return FindMax(root->right);
}
void PreorderTraversal(Node* root) {
    if (!root) return;
    printf("%d  ", root->val);
    PreorderTraversal(root->left);
    PreorderTraversal(root->right);
}

二叉搜索树--非递归--插入、删除和查找

#define _CRT_SECURE_NO_WARNINGS
//二叉查找树   非递归实现  插入,删除和查找
#include<stdio.h>
#include<stdlib.h>

typedef struct Node {
    int val;
    struct Node* left;
    struct Node* right;
}Node;
typedef int bool;

Node* Find(Node* root, int a);   //如果找到了返回指针 如果找不到则返回空指针
Node* Insert(Node* root, int a);  //将a插入到root中并且返回根节点指针
Node* Delete(Node* root, int a);   //将a从root中删除并且返回根节点指针
Node* FindMin(Node* root);//找到最小节点并且返回该节点的指针
Node* FindMax(Node* root);//找到最大节点并且返回该节点的指针
void PreorderTraversal(Node* root); //先序遍历
int main() {
    Node* root = (Node*)malloc(sizeof(Node));//根节点
    Node* BST, * MinP, * MaxP, * Tmp;   //分别是树根节点   最小节点 最大节点 和一个临时用的节点指针变量
    int X;
    int N, i;
    BST = NULL;
    scanf("%d", &N);//插入节点
    for (i = 0; i < N; i++) {
        scanf("%d", &X);
        BST = Insert(BST, X);
    }
    printf("Preorder:"); PreorderTraversal(BST); printf("\n");//先序遍历
    MinP = FindMin(BST);
    MaxP = FindMax(BST);
    scanf("%d", &N);//查找节点
    for (i = 0; i < N; i++) {
        scanf("%d", &X);
        Tmp = Find(BST, X);
        if (Tmp == NULL) printf("%d is not found\n", X);
        else {
            printf("%d is found\n", Tmp->val);
            if (Tmp == MinP) printf("%d is the smallest key\n", Tmp->val);
            if (Tmp == MaxP) printf("%d is the largest key\n", Tmp->val);
        }
    }
    scanf("%d", &N);//删除节点
    for (i = 0; i < N; i++) {
        scanf("%d", &X);
        BST = Delete(BST, X);
    }
    printf("Preorder:"); PreorderTraversal(BST); printf("\n");//先序遍历
    return 0;
}
Node* Find(Node* root, int a) { //查找
    if (!root) return NULL;
    while (root) {
        if (a == root->val) {
            break;
        }
        else if (a > root->val) {
            root = root->right;
        }
        else {//a< root->val
            root = root->left;
        }
    }
    return root;
}
Node* Insert(Node* root, int a) {
    if (!root) {
        root = (Node*)malloc(sizeof(Node));
        root->val = a;
        root->left = root->right = NULL;
    }
    else {
        Node* cur = root;
        Node* pre = NULL;
        while (cur) {
            if (a > cur->val) {
                pre = cur;
                cur = cur->right;
            }
            else if (a < cur->val) {
                pre = cur;
                cur = cur->left;
            }
            else {
                break;//找到了值为a的节点
            }
        }
        if (!cur) {  //如果没有找到 则插入
            if (a < pre->val) {
                pre->left = (Node*)malloc(sizeof(Node));
                pre->left->left = pre->left->right = NULL;
                pre->left->val = a;
            }
            else {
                pre->right = (Node*)malloc(sizeof(Node));
                pre->right->left = pre->right->right = NULL;
                pre->right->val = a;
            }
        }
    }
    return root;
}
Node* Delete(Node* root, int a) {//为什么代码这么长?因为没用到递归也没用到引用 就需要一个pre
    if (!root) return root;//根节点为空
    Node* pre = NULL;
    Node* cur = root;
    while (cur) {
        if (a < cur->val) {
            pre = cur;
            cur = cur->left;
        }
        else if (a > cur->val) {
            pre = cur;
            cur = cur->right;
        }
        else {
            if ((!cur->left) && (!cur->right)) {
                if (!pre) {//cur为根节点
                    free(cur);
                    return pre;
                }
                if (a < pre->val) {
                    pre->left = NULL;
                }
                else {
                    pre->right = NULL;
                }
                return root;
            }
            else if (!cur->right) {
                if (!pre) {
                    cur = cur->left;
                    free(root);
                    return cur;
                }
                if (a < pre->val) {
                    pre->left = cur->left;
                    free(cur);
                }
                else {
                    pre->right = cur->left;
                    free(cur);
                }
                return root;
            }
            else if (!cur->left) {
                if (!pre) {
                    cur = cur->right;
                    free(root);
                    return cur;
                }
                if (a < pre->val) {
                    pre->left = cur->right;
                    free(cur);
                }
                else {
                    pre->right = cur->right;
                    free(cur);
                }
                return root;
            }
            else {
                Node* temp = cur->left;
                while (temp->right) {
                    temp = temp->right;
                }
                temp->right = cur->right;
                if (!pre) { Node* t = cur->left; free(cur); return t; };
                if (a < pre->val) {
                    pre->left = cur->left;
                }
                else {
                    pre->right = cur->left;
                }
                free(cur);
                return root;
            }
        }
    }
    return root;
}
Node* FindMin(Node* root) {
    if (!root) {
        return NULL;
    }
    while (root->left) {
        root = root->left;
    }
    return root;
}
Node* FindMax(Node* root) {
    if (!root) {
        return NULL;
    }
    while (root->right) {
        root = root->right;
    }
    return root;
}
void PreorderTraversal(Node* root) {
    if (!root) return;
    printf("%d  ", root->val);
    PreorderTraversal(root->left);
    PreorderTraversal(root->right);
}

 由前序中序重建二叉树

 由中序后序重建二叉树

【Morris_Traversal】二叉树遍历(前|中|后 序)--非递归--不用栈--(完整代码)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define DataType int
#define nullptr 0
#define MAXN 2048
typedef struct node {
    DataType data;
    struct node* pleft;
    struct node* pright;
}TNode, * TreeRoot;
TNode* CreateTree() {//构建二叉树  (先序)
    int a;
    scanf("%d", &a);
    if (a != -1){
        TNode* ne = (TNode*)malloc(sizeof(TNode));
        ne->data = a;
        ne->pleft = CreateTree();
        ne->pright = CreateTree();
        return ne;
    }
    return nullptr;
}
void traversal_pre(TNode * root) { //先序遍历二叉树morris_traversal  (已过测试集)
    while (root) {
        if (root->pleft) {
            TNode* rightmost = root->pleft;
            while (rightmost->pright&&rightmost->pright!=root) {
                rightmost = rightmost->pright;
            }
            if (rightmost->pright) {
                rightmost->pright = nullptr;
                root = root->pright;
            }
            else {
                printf("%d ", root->data); //输出数据
                rightmost->pright = root;
                root = root->pleft;
            }
        }
        else {
            printf("%d ", root->data); //输出数据
            root = root->pright;
        }
    }
}
void traversal_mid(TNode* root) { //中序遍历二叉树morris_traversal  (已过测试集)
    while (root) {
        if (root->pleft) {
            TNode* rightmost = root->pleft;
            while (rightmost->pright && rightmost->pright != root) {
                rightmost = rightmost->pright;
            }
            if (rightmost->pright) {
                rightmost->pright = nullptr;
                printf("%d ", root->data); //输出数据
                root = root->pright;
            }
            else {
                rightmost->pright = root;
                root = root->pleft;
            }
        }
        else {
            printf("%d ", root->data); //输出数据
            root = root->pright;
        }
    }
}
void traversal_pos(TNode* root) { //后序遍历二叉树morris_traversal    (已过测试集)
    int temp[MAXN];
    int n = 0;
    while (root) {
        if (root->pright) {
            TNode* lm = root->pright;
            while (lm->pleft&&lm->pleft != root) {
                lm = lm->pleft;
            }
            if (lm->pleft) {
                lm->pleft = nullptr;
                root = root->pleft;
            }
            else {
                lm->pleft = root;
                //printf("%d", root->data);
                temp[n++] = root->data;
                root = root->pright;
            }
        }
        else {
            temp[n++] = root->data;
            root = root->pleft;
        }
    }
    while (n) {
        printf("%d ", temp[--n]);
    }
}
int main() {
    TNode * tree = CreateTree();  //创建二叉树

    //traversal_pre(tree);
    //traversal_mid(tree);
    traversal_pos(tree);
    //system("pause");
    return 0;
}
/*
空树: -1
 ==============
     1

:1 -1 -1
先序遍历结果; 1
中序遍历结果: 1
后序遍历结果:1
=======================
      1
    2

:1 2 -1 -1 -1
先序遍历结果: 1  2
中序遍历结果: 2  1
后序遍历结果:2  1
=======================
      1
        2

:1 -1 2 -1 -1
先序遍历结果: 1  2
中序遍历结果: 1  2
后序遍历结果:2  1
=======================
       1
    2      3
      4   5  6

:1 2 -1 4 -1 -1 3 5 -1 -1 6 -1 -1
先序遍历结果:1  2  4  3  5  6
中序遍历结果:2  4  1  5  3  6
后序遍历结果: 4  2  5  6  3  1
*/

计算机c++数据结构保姆教学 理解数据结构底层原理,简单易懂 阅读详情

相关推荐

C语言实现二叉树(附完整源码)

#include<stdio.h> #include<stdlib.h> #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define SUCCESS 1 #define UNSUCCESS 0 #define dataNum 5 int i = 0; int dep = 0; char data[dataNum] = { 'A', 'B', 'C', 'D', 'E'

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1207

二叉树的实现(C语言数据结构)

一、以下是我们需要实现的功能 #pragma once #include <stdio.h> #include <stdlib.h> #include <assert.h> #include <stdbool.h> typedef char BTDataType; typedef struct BinaryTreeNode { BTDataType _data; struct BinaryTreeNode* _left; stru

芊樱烛渊的博客 1万+

遍历二叉树C实现代码

遍历二叉树的几种算法实现,主要如下: 1.前序遍历二叉树; 2.中序遍历二叉树; 3.后序遍历二叉树; 4.层次遍历二叉树。

数据结构之二叉树(C语言附详细代码)

关于树的简要概念和二叉树的重点内容,以及二叉树的操作代码,前中后序遍历代码以及层次遍历代码

m0_68210771的博客 1万+

C++数据结构二叉树的各项功能实现

1. 建立二叉树 2. 计算结点所在的层次 3.统计结点数量和叶结点数量 4.计算二叉树的高度 5.计算结点的度 6.找结点的双亲和子女 7.二叉树的遍历 8.二叉树的输出等等

避坑指南:Python模拟抖音扫码登录时,那些你可能会遇到的‘Referer’和‘Token’校验问题

本文深入解析Python模拟抖音扫码登录时常见的Referer校验与Token失效问题,提供五大陷阱的解决方案。从动态fp参数生成到Referer校验策略,再到Token生命周期管理,手把手教你破解抖音登录接口的反爬机制,助力开发者高效完成自动化登录。

weixin_42573113的博客 780

树和二叉树 (C语言)《数据结构与算法》

目录 序言 1.树概念及结构 1.1树的概念 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用(表示文件系统的目录树结构) 2.二叉树概念及结构 2.1概念 2.2现实中的二叉树 2.3数据结构中的二叉树 2.4特殊的二叉树 2.5 二叉树的存储结构 2.6二叉树的性质 2.7二叉树的存储结构 2.7.1顺序存储 2.7.2链式存储 3.二叉树的顺序结构及实现 3.1 二叉树的顺序结构 4.二叉树链式结构的实现 ...

原来45的博客 8719

自动驾驶感知融合算法拆解:从华为MDC案例看前融合与大融合的工程实现

本文深度解析了华为MDC平台在自动驾驶感知融合算法中的前沿工程实践,重点探讨了Camera-Lidar前融合与多传感器大融合的架构设计。通过异构融合架构、数据流优化和场景化应用,华为MDC平台实现了高效、安全的感知能力,显著提升了自动驾驶系统的性能与可靠性。

weixin_29198045的博客 535

数据结构 第五章(树和二叉树)【上】

(1)树是n(n≥0)个结点的有限集,它或为空树(n=0),或为非空树。对于非空树T,有且仅有一个称之为根的结点(一棵树可以只有根结点,没有其它结点),除根结点以外的其余结点可分为m(m>0)个互不相交的有限集,其中每个集合本身又是一棵树,并且称为根的子树(下图中结点A有3棵子树)。(2)树的结构定义是一个递归的定义,即在树的定义中又用到树的定义。(1)二叉树(Binary Tree)是n(n≥0)个结点所构成的集合,它或为空树(n=0),或为非空树。对于非空树T有且仅有一个称之为根的。

Zevalin的博客 1801

一、数学建模层次分析法(AHP)【清风数学建模个人笔记】

层次分析法: 层次分析法主要用于解决评价类问题(例如:选择哪种方案更好、哪位员工、运动员等表现得更优秀) 评价类问题: 分析问题得出评判问题的子标,分别给不同子标赋予权重(权重和要为1) ...

m0_58882109的博客 1万+

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

一种基于频域滤波法消除干扰项与角谱法重构技术的数字全息显微台阶形貌测量实例分析

简单光学 2034

数据结构与算法整理7——树与二叉树(C语言)

数据结构与算法整理7——树与二叉树(C语言) 目录 数据结构与算法整理7——树与二叉树(C语言) 1、树和二叉树的概念 1.1 树 1.2 二叉树 1.3 二叉树的分类 1.4 二叉树的性质 1.5 二叉树的存储方式 1.6 线索二叉树 2、二叉树的周游,中,先—>后,画树 3、哈夫曼算法及哈夫曼编码,WPL的计算 3.1 哈夫曼树相关概念 3.2 哈夫曼树的构造 ...

weixin_40695088的博客 749

HFSS 3D LAOUT PCB 裁剪,差分线,过孔仿真和优化

我本身不是做天线设计的,所以HFSS这个软件给我主要还是做PCB级别的高速信号完整性仿真,一般2.5D的仿真软件无法对过孔和跨平面进行仿真。所以要借助三维电磁软件进行。今天就针对PCB进行裁剪。为什么要裁剪?以为如果把整个PCB一起仿真的话,应该要好几个月吧。所以为了加快仿真速度,必须进行裁剪仿真。①candence的PCB可以直接导入。那么先导入brd文件,file-import-candence结果如下②点击cutout,选中要仿真的net和参考平面。这里最好选creat new不然会把原文件覆盖掉。注

gjatwfn的专栏 1万+

树和二叉树知识点大全及相关题目练习【数据结构】

树和二叉树要点及题目练习

f2568ryghi的博客 1366

【微电网优化】基于粒子群求解CHP机组、气网、电网、储热罐和电锅炉微电网优化模型附matlab代码

1 简介 我国风力发电近年发展迅速,装机容量已成为全球首位.随着风力发电在电力系统中的渗透率不断提高,我国多个地区(尤其是"三北"地区)已经面临着十分严峻的风电消纳问题,产生不容忽视的弃风问题.针对目前我国风电消纳存在的困难,本文提出粒子群优化CHP机组、气网、电网、储热罐和电锅炉微电网控制策略. 2 部分代码 Ppv=[0;0;0;0;0;0;9.86000000000000;19.0100000000000;33.1000000000000;45.0700000000000;64.7900000

qq_59747472的博客 672

用 CL_SALV_TREE 把层级数据做成一棵会呼吸的 ABAP ALV 树:从类继承扫描到事件交互的完整拆解

本文介绍了SAP ABAP中使用CL_SALV_TREE实现树形ALV报表的方法。该技术将层级数据(如类继承关系)以可展开/折叠的树形结构展示,解决了传统ALV Grid无法直观显示层次结构的问题。核心实现采用"数据表+层级表"分离的设计模式:数据表存储节点业务信息,层级表维护父子关系。通过add_node方法动态构建树形结构,支持设置节点文本、图标和事件。文中提供了完整示例代码,演示了如何递归扫描ABAP类继承关系并构建树形ALV,这种技术特别适用于展示类族谱、权限树等层级数据,能显著

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 206

《数据结构》C语言版(清华严蔚敏考研版) 全书知识梳理 + 练习习题详解(超详细清晰易懂)

《数据结构》知识梳理,适合考前复习,高分冲刺。包含大量习题,偷偷告诉你,考试就考这个

繁凡さん的博客 23万+

SSH 远程登录报错:kex_exchange_identification: Connection closed.....

不知道为啥会出现这样的情形,最近这段时间登录都是正常的,不知道哪里抽风了,就提示这个。错误信息 kex_exchange_identification: Connection closed by remote host 出现在尝试使用 SSH 连接到远程服务器过程中,表明在密钥交换阶段的一开始,远程主机就关闭了连接。服务器的sshd_config文件中配置错误,可能是不允许的加密算法、修订文件中的语法错误,或者未正确指定用于SSH的HostKey。如果当前已有太多活动连接,新的连接尝试可能会被拒绝。

飞越蓝天的专栏 8297

【数据结构复习之路】树和二叉树(严蔚敏版)万字详解&主打基础

二叉树是 n (n≥0) 个结点的有限集,它或者是 空集 (n = 0),或者由一个根结点及两棵互不相交的 分别称作这个根的左子树和右子树的二叉树组成。每个结点最多有俩孩子 (二叉树中不存在度大于 2 的结点)。子树有左右之分,其次序不能颠倒。二叉树可以是空集合,根可以有空的左子树或空的右子树。⚠️注意:二叉树不是树的特殊情况,它们是两个概念。理由:二叉树结点的子树要区分左子树和右子树,即使只有一棵子树也要进行区分,说明它是左子树,还是右子树。树当结点只有一个孩子时,就无须区分它是左还是右。

m0_74215326的博客 2960

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据结构整理笔记(提纲) (数据结构 C语言版 第二版 严蔚敏)

第一章 绪论基本概念数据结构(这门学科): 是一门研究数据的组织, 存储, 和运算的一般方法。 数据: 是客观事物的符号表示, 是所有能输入到计算机中并被计算机程序处理的符号的总称。 数据元素: 是数据的基本单位, 在计算机中通常作为一个整体进行考虑和处理。数据元素用于完整地描述一个对象。 数据项: 组成数据元素的、 有独立含义的、 不可分割的最小单位。例如 :学生的姓名学号等。 数据对象...

你轻轻地走了 4636

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

树和二叉树

在对数据结构-二叉树有了一个初步的接触之后之后,整理出了树和二叉树的一些基本知识,希望能够对大家有所帮助!

m0_61245168的博客 956

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

数据结构 第五章(树和二叉树)【下】

本文摘要主要介绍了数据结构中树、森林与哈夫曼树的相关知识点,包括存储结构、遍历方法、构造算法以及实际应用。文章首先探讨了树的三种存储结构(双亲表示法、孩子表示法、孩子兄弟表示法),并分析了森林与二叉树的相互转换规则。随后详细讲解了哈夫曼树的构造过程、特点及编码实现,包括带权路径长度的计算和前缀编码的生成方法。最后提供了多个二叉树算法设计实例,如判断二叉树相等、交换左右子树、计算最大宽度等,均配有C语言实现代码。全文结合理论分析与代码实践,适合数据结构学习者参考。

Zevalin的博客 1362

数据结构——树、二叉树和森林间的转换

介绍🍃数据结构专区数据结构参考该部分知识参考于《数据结构(C语言版 第2版)》129~130页🌈每一个清晨,都是世界对你说的最温柔的早安:ૢ(≧▽≦)و✨目录前言1、基础知识2、树转换为二叉树2.2 演示3、森林转换为二叉树3.2 演示4、二叉树转换为树或森林4.2 演示⑴加线——树中所有相邻兄弟结点之间加一条连线;⑵去线——对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其它孩子结点之间的连线;⑶层次调整——以根结点为轴心,将树顺时针转动一定的角度,使之层次分明。

2301_80492355的博客 1686

数据结构知识点整理(类C语言实现)(在更新)

/函数结果状态代码10#define OK1012//Status 是函数的类型,其值是函数结果状态代码//结点的数据域//结点的指针域//LinkList为指向结构体Lnode的指针类型//定义一个结构体类型指针的两种方式Lnode *p;LinkList L;//一般区分使用://定义链表LLinkList L;//定义结点指针p:Lnode *p;eg:存储学生学号、姓名、成绩的单链表结点类型定义方式a:不常用,因为存在多个数据域//学号//姓名。

m0_63024740的博客 278

【亲测免费】 王道数据结构+C语言版+超全笔记(图文)+个人整理版本

王道数据结构+C语言版+超全笔记(图文)+个人整理版本 【下载地址】王道数据结构C语言版超全笔记图文个人整理版本 本资源文件为《王道数据结构+C语言版+超全笔记(图文)+个人整理版本》,内容涵盖了数据结构与算法的核心知识点,适用于自学、考研党408科目等。笔记自带标签,方便快速定位;同时包含个人整理的示例代码,图文结合,...

gitblog_06652的博客 669

数据结构-用C语言描述耿国华版总结笔记(下篇)

第六章 树与二叉树 (一)二叉树 1.1树相关术语: 度(一个结点的子树个数);结点的层次(从该结点开始往下有多少层);树的度(树中所有结点的度的最大值);树的高度(树中所有结点的层次的最大值)。 1.2二叉树的性质: 1.二叉树...

云瀚的自习室 5651
上一篇: 卡特兰数在括号串中的应用
下一篇: 广度优先搜索(BFS)的一个(重要!)细节(可能因此卡题)
咖啡咖_CoffCa
博客等级 码龄6年 116粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

咖啡咖_CoffCa

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

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

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

打赏作者

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

抵扣说明:

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

余额充值