05 二叉树先序/中序/后序遍历

函数都放进一个.cpp文件里发现太繁琐了,这里使用多文件声明使用,看起来更简洁。

树的形状

在这里插入图片描述

运行结果

在这里插入图片描述

CODE

main.cpp

#include "func.h"


#include "func.h"


// 1.2 对二叉树的先序、中序、后续遍历
// 递归思想
// 先序遍历: 先访问该节点,再往左走,最后往右走,在第一次到达节点时访问节点
// 中序遍历: 先往左走,再访问该节点,最后往右走,在第二次到达节点时访问节点
// 后续遍历: ...

void visit(BiNode *node){
    printf("%c\t",node->data);
}

void PreOrder(BiTree tree){
    if (tree != NULL){
        visit(tree);
        PreOrder(tree->left);
        PreOrder(tree->right);
    }
}

void InOrder(BiTree tree){
    if (tree != NULL){
        InOrder(tree->left);
        visit(tree);
        InOrder(tree->right);
    }
}

void PostOrder(BiTree tree){
    if (tree != NULL){
        PostOrder(tree->left);
        PostOrder(tree->right);
        visit(tree);
    }
}


int main() {
    BiTree tree;
    getDemo(tree);
    PreOrder(tree);
    printf("\n");
    InOrder(tree);
    printf("\n");
    PostOrder(tree);
    return 0;
}

build_demo.cpp:用于树的构建

#include "func.h"

void init(BiTree &tree){
    tree = (BiNode*) malloc(sizeof(BiNode));
    tree->left = NULL;
    tree->right = NULL;
}

BiNode* create_node(Element elem){
    BiNode *p_node = (BiNode*) malloc(sizeof(BiNode));
    p_node->data = elem;
    p_node->left=p_node->right=NULL;
    return p_node;
}

BiTree getDemo(BiTree &tree){
    // Demo:
    //                  A
    //              B       C
    //           D    E  NULL   F
    //
    init(tree);
    Element A,B,C,D,E,F;
    A.value = 'A';
    B.value = 'B';
    C.value = 'C';
    D.value = 'D';
    E.value = 'E';
    F.value = 'F';
    BiNode *pb = create_node(B);
    BiNode *pc = create_node(C);
    BiNode *pd = create_node(D);
    BiNode *pe = create_node(E);
    BiNode *pf = create_node(F);
    tree->data = A;
    tree->left = pb;
    tree->right = pc;
    pb -> left = pd;
    pb->right = pe;
    pc->right = pf;
}


func.h

//
// Created by 64516 on 2023/1/25.
//

#ifndef ORDER_01_FUNC_H
#define ORDER_01_FUNC_H


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



typedef struct Element{
    char value;
};

typedef struct BiNode{
    Element data;
    BiNode *left,*right;  // 可以将节点左右指针初始化为NULL吗?
}BiNode,*BiTree;

BiTree getDemo(BiTree &tree);

#endif //ORDER_01_FUNC_H

(ps: 之前写的顺序表和单链表等代码也都是用一个文件写的考研也不会考这些基本操作,考虑把这些基本操作在二轮做大题的时候都用另一个文件存起来)

多文件

头文件是扩展名为 .h 的文件,可以把用到的结构体和函数声明写里面,结构体和函数可以被多个源文件引用共享。有两种类型的头文件:程序员编写的头文件和编译器自带的头文件, stdio.h 头文件,它是编译器自带的头文件。

.h文件里面些什么:
结构体共享:这里我把三种遍历函数放到了main.cpp中,三种遍历函数用到了结构体的声明,故结构体肯定需要全部共享。就算我把三个遍历函数都放在另一个原函数里面,结构体依旧需要共享。
函数共享:这取决于main函数用到了哪些函数,如果用到的函数被写在其它文件里面了,那肯定需要被共享了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C语言中,可以使用指针和递归函数来实现二叉树先序中序后序遍历。 首先,我们需要定义一个二叉树的结构体,包含一个数据域和左右子树指针域: ```c typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode; ``` 接下来,我们可以分别实现先序中序后序遍历的函数。 (1)先序遍历: 先序遍历是按照根节点、左子树、右子树的顺序进行遍历。 ```c void preorderTraversal(TreeNode* root) { if (root == NULL) return; printf("%d ", root->data); // 先访问根节点 preorderTraversal(root->left); // 遍历左子树 preorderTraversal(root->right); // 遍历右子树 } ``` (2)中序遍历中序遍历是按照左子树、根节点、右子树的顺序进行遍历。 ```c void inorderTraversal(TreeNode* root) { if (root == NULL) return; inorderTraversal(root->left); // 遍历左子树 printf("%d ", root->data); // 访问根节点 inorderTraversal(root->right); // 遍历右子树 } ``` (3)后序遍历后序遍历是按照左子树、右子树、根节点的顺序进行遍历。 ```c void postorderTraversal(TreeNode* root) { if (root == NULL) return; postorderTraversal(root->left); // 遍历左子树 postorderTraversal(root->right); // 遍历右子树 printf("%d ", root->data); // 访问根节点 } ``` 以上就是用C语言实现二叉树先序中序后序遍历的方法。这些遍历方法都是基于递归的,通过递归调用实现对二叉树的深度优先搜索。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值