二叉树的基本概念

在这里插入图片描述

1 二叉树中的“原子”

typedef struct __tag_treeNode{
    char dat;
    struct __tag_treeNode *L;
    struct __tag_treeNode *R;
}Tree, *pTree;

2 创建二叉树

2.1 创建“结点”

pTree Tree_createNode(char dat)
{
    pTree newNode = malloc(sizeof(Tree));
    if(newNode == NULL){
        return NULL;
    }
    newNode->dat = dat;
    newNode->L = NULL;
    newNode->R = NULL;

    return newNode;
}

2.2 连接“结点”

void Tree_insertNode(pTree parentNode, pTree L, pTree R)
{
    parentNode->L = L;
    parentNode->R = R;
}

2.3 打印当前结点数据

void Tree_printCurrentNodeDat(pTree currentNode)
{
    printf("%c\t", currentNode->dat);
}

3 遍历顺序

3.1 前序遍历

3.1.1 递归方法

void Tree_printTree_preorder(pTree cureentNode)
{
    if(cureentNode == NULL){
        return;
    }

    Tree_printCurrentNodeDat(cureentNode);
    Tree_printTree_preorder(cureentNode->L);
    Tree_printTree_preorder(cureentNode->R);
}

3.1.2 非递归方法

void Tree_printTree_preorder_way2(pTree tree)
{
    if(tree == NULL){
        return;
    }
    // stack stucture implement
    pTree stack[10];
    int stackTop = -1;
    pTree pMove = tree;
    while(stackTop != -1 || pMove){
    // while(stackTop > -1){
        while(pMove){
            printf("%c\t", pMove->dat);
            stack[++stackTop] = pMove;
            pMove = pMove->L;
        }
        if(stackTop != -1){
            pMove = stack[stackTop]; ;
            stackTop--; // pop
            pMove = pMove->R;
        }
    }
}

3.2 中序遍历

3.2.1 递归方法

void Tree_printTree_inorder(pTree cureentNode)
{
    if(cureentNode == NULL){
        return;
    }

    Tree_printTree_inorder(cureentNode->L);
    Tree_printCurrentNodeDat(cureentNode);
    Tree_printTree_inorder(cureentNode->R);
}

3.2.2 非递归方法

void Tree_printTree_inorder_way2(pTree tree)
{
    if(tree == NULL){
        return;
    }
    // stack stucture implement
    pTree stack[10];
    int stackTop = -1;
    pTree pMove = tree;
    while(stackTop != -1 || pMove){
    // while(stackTop > -1){
        while(pMove){
            stack[++stackTop] = pMove;
            pMove = pMove->L;
        }
        if(stackTop != -1){
            pMove = stack[stackTop]; 
            stackTop--; // pop

            printf("%c\t", pMove->dat);

            pMove = pMove->R;
        }
    }
}

3.3 后序遍历

3.3.1 递归方法

void Tree_printTree_postorder(pTree cureentNode)
{
    if(cureentNode == NULL){ // termination
        return;
    }

    Tree_printTree_postorder(cureentNode->L);
    Tree_printTree_postorder(cureentNode->R);
    Tree_printCurrentNodeDat(cureentNode);
}

3.3.2 非递归方法

void Tree_printTree_postorder_way2(pTree tree)
{
    if(tree == NULL){
        return;
    }
    // stack stucture implement
    pTree stack[10];
    int stackTop = -1;
    pTree pMove = tree;
    pTree pNodeVisited = NULL;

    while(pMove){ // Locating the bottom of the left
        stack[++stackTop] = pMove; // Saving the path
        pMove = pMove->L;
    }
    while(stackTop != -1){
        pMove = stack[stackTop]; // backing one
        stackTop--; // pop
        
        if(pMove->R == NULL || pMove->R == pNodeVisited){ // Right node of curent node
            printf("%c\t", pMove->dat);
            pNodeVisited = pMove;
        }else{
            stack[++stackTop] = pMove;
            pMove = pMove->R;
            while(pMove){
                stack[++stackTop] = pMove;
                pMove = pMove->L;
            }
        }
    }
}

4 测试用例

int main(int argc, char *argv[])
{
    pTree A = Tree_createNode('A');
    pTree B = Tree_createNode('B');
    pTree C = Tree_createNode('C');
    pTree D = Tree_createNode('D');
    pTree E = Tree_createNode('E');
    pTree F = Tree_createNode('F');
    pTree G = Tree_createNode('G');
    pTree H = Tree_createNode('H');

    Tree_insertNode(A, B, C);
    Tree_insertNode(B, D, NULL);
    Tree_insertNode(D, G, NULL);
    Tree_insertNode(C, E, F);
    Tree_insertNode(E, NULL, H);

    printf("root is in the front(recursive): \r\n");
    Tree_printTree_preorder(A);
    printf("\r\n");

    printf("root is in the front(non-recursive): \r\n");
    Tree_printTree_preorder_way2(A);
    printf("\r\n");

    printf("root is in the middle(recursive): \r\n");
    Tree_printTree_inorder(A);
    printf("\r\n");

    printf("root is in the middle(non-recursive): \r\n");
    Tree_printTree_inorder_way2(A);
    printf("\r\n");

    printf("root is in the back(recursive): \r\n");
    Tree_printTree_postorder(A);
    printf("\r\n");

    printf("root is in the back(non-recursive): \r\n");
    Tree_printTree_postorder_way2(A);
    printf("\r\n");

    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值