初阶数据结构(C语言实现)——5.5 二叉树的链式结构的实现

二叉树:

typedef int BTDataType;
typedef struct BinaryTreeNode
{
   
 BTDataType _data;
 struct BinaryTreeNode* _left;
 struct BinaryTreeNode* _right;
}BTNode;
BTNode* CreatBinaryTree()
{
   
 BTNode* node1 = BuyNode(1);
 BTNode* node2 = BuyNode(2);
 BTNode* node3 = BuyNode(3);
 BTNode* node4 = BuyNode(4);
 BTNode* node5 = BuyNode(5);
 BTNode* node6 = BuyNode(6);
 
 node1->_left = node2;
 node1->_right = node4;
 node2->_left = node3;
 node4->_left = node5;
 node4->_right = node6;
 return node1;
}

1 二叉树的前、中、后序遍历

1.1 前序、中序以及后序遍历

学习二叉树结构,最简单的方式就是遍历。所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。
在这里插入图片描述

按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:

  1. 前序遍历(Preorder Traversal 亦称先序遍历)——访问根结点的操作发生在遍历其左右子树之前。
  2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。
  3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

// 二叉树前序遍历
void preOrder(BTNode* root);
// 二叉树中序遍历
void inOrder(BTNode* root);
// 二叉树后序遍历
void postOrder(BTNode* root);

1.2 前序遍历递归图解

在这里插入图片描述

1.3 前序遍历递归调用函数图解

在这里插入图片描述

图中二叉树
前序遍历结果:1 2 3 4 5 6
中序遍历结果:3 2 1 5 4 6
后序遍历结果:3 1 5 6 4 1
中序和后序调用和前序的递归调用差不多,只是访问顺序不同,此处不再赘述。

1.3 前中后序遍历代码实现

1.3.0 创建一个固定的二叉树

  • 思路:写死一个固定二叉树,申请空间,然后手动指向左右子树

创建二叉树就是这个样子的
在这里插入图片描述

  • 创建二叉树代码实现
typedef int BTDataType;
typedef struct BinaryTreeNode
{
   
    BTDataType _data;
    struct BinaryTreeNode* _left;
    struct BinaryTreeNode* _right;
}BTNode;
BTNode* BuyNode(BTDataType x)
{
   
    BTNode* node = (BTNode*)malloc(sizeof(BTNode));
    if (node == NULL)
    {
   
        perror("malloc fail");
        return NULL;
    }

    node->_data = x;
    node->_left = NULL;
    node->_right = NULL;

    return node;
}
BTNode* CreatBinaryTree()
{
   
    BTNode* node1 = BuyNode(1);
    BTNode* node2 = BuyNode(2);
    BTNode* node3 = BuyNode(3);
    BTNode* node4 = BuyNode(4);
    BTNode* node5 = BuyNode(5);
    BTNode* node6 = BuyNode(6);

    node1->_left = node2;
    node1->_right = node4;
    node2->_left = node3;
    node4->_left = node5;
    node4->_right = node6;

    return node1;
}

1.3.1 前序遍历

前序遍历是 :根 左 右
在这里插入图片描述

二叉树的前序遍历结果实际是:1 2 3 MULL NULL NULL 45 NULL NULL 6 NUL NULL
我们不打印NULL就是:1 2 3 4 5 6

  • 前序遍历代码实现
//前序
void preOrder(BTNode * root)
{
   
    if (root == NULL)
    {
   
        printf("NULL ");
        return;
    }
    printf("%d ", root->_data);
    preOrder(root->_left);
    preOrder(root->_right);
}
  • 前序遍历代码验证1

在这里插入图片描述

  • 前序遍历代码验证2

在这里插入图片描述

1.3.2 中序遍历

前序遍历是 : 左 根 右
在这里插入图片描述

二叉树的前序遍历结果实际是:NULL 3NULL 2 NL 1NLL 5 NULL 4 NULL 6 NULL
我们不打印NULL就是:3 2 1 5 4 6

//中序遍历
void inOrder(BTNode* root)
{
   
    if (root == NULL)
    {
   
        printf("NULL ");
        return;
    }
    inOrder(root->left);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值