Parcours dans l'ordre d'un arbre binaire (langage C)

Nous expliquons le parcours dans l'ordre des arbres binaires à partir de deux directions ( récursivité + itération )

1. Récursivité

Pensée:

Traversez du nœud racine à son enfant gauche, visitez toujours l'enfant gauche de chaque nœud, revenez quand il atteint NULL, enregistrez la valeur de chaque nœud lors du retour, puis visitez l'enfant droit du nœud, s'il est NULL, retournez directement La couche précédente, si elle n'est pas NULL, répétez l'opération ci-dessus jusqu'à ce que tous les nœuds soient traversés.

code afficher comme ci-dessous:

void BTreeInOrder(struct TreeNode* root,int* arry,int* returnSize){//中序遍历
    if(NULL==root){//判出条件
        return;
    }
    BTreeInOrder(root->left,arry,returnSize);
    arry[(*returnSize)++]=root->val;
    BTreeInOrder(root->right,arry,returnSize);
}

Le processus de fonctionnement spécifique : (comme indiqué sur la figure)

2.  Itération :

Pensée : (La traversée de la pré-commande consiste à enregistrer la valeur du nœud lors de la poussée dans la pile (pour plus de détails, voir la traversée de la pré-commande que j'ai écrite auparavant), et la traversée dans l'ordre consiste à enregistrer la valeur du nœud lors de l'extraction de la pile)

Nous savons comment le processus récursif fonctionne selon ce qui précède, nous pouvons donc utiliser la pile pour imiter ce processus, de manière à utiliser l'itération pour réaliser le parcours dans l'ordre de l'arbre binaire. L'enfant gauche est poussé dans la pile jusqu'à ce que le L'élément supérieur de la pile est NULL et la boucle suivante est entrée. Tout d'abord, NULL est retiré de la pile, puis la valeur et l'adresse de l'élément supérieur de la pile sont enregistrées, puis retirées de la pile, puis la droite enfant de l'élément enregistré est poussé sur la pile, qui est NULL continuera la deuxième boucle, sinon NULL quittera la deuxième boucle, continue la première boucle jusqu'à ce que tous les nœuds soient visités.

code afficher comme ci-dessous:

typedef struct TreeNode BTNode;

typedef struct Stack{//C语言中没有栈,所以我自己定义个栈的结构体方便后面使用
    BTNode* a_[100];//存储结点的指针数组
    int size;//数组长度
}Stack;

void StackPush(Stack* b,BTNode* root){//入栈
    b->a_[b->size++]=root;
}

void StackPop(Stack* b){//出栈
    b->size--;
}

int* inorderTraversal(struct TreeNode* root, int* returnSize){//中序遍历
    int* a=(int*)malloc(sizeof(int)*100);//动态创建数组用来存储遍历时的结点数值
    if(NULL==a){
        printf("申请节点失败!\n");
        return NULL;
    }
    Stack b;//创建栈变量
    int i=0;
    BTNode* root_temp;//创建一个指针变量用来记录出栈时的栈顶元素
    b.size=0;//初始化栈
    StackPush(&b,root);//先将根节点入栈
    while(NULL != b.a_[b.size-1]){//第一个循环
        StackPush(&b,b.a_[b.size-1]->left);//将栈顶元素的左孩子入栈,直到栈顶为NULL时进入
//下一个循环
        while(NULL == b.a_[b.size-1]){//第二个循环
            StackPop(&b);//向将NULL出栈
            if(0==b.size){//判断是否访问完所有结点
                (*returnSize)=i;
                return a;
            }
            a[i++]=b.a_[b.size-1]->val;//记录栈顶元素的值
            root_temp=b.a_[b.size-1];//记录栈顶元素的地址
            StackPop(&b);//将栈顶元素出栈
            StackPush(&b,root_temp->right);//将记录的元素的右孩子入栈,继续进行循环
        }
    }
    (*returnSize)=i;
    return a;
}

Le processus de fonctionnement spécifique : (comme indiqué sur la figure)

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_49312527/article/details/122398475
conseillé
Classement