【二叉树】先序、中序、后序遍历规则和已知两种遍历求另外一种遍历。包教包会!【】

一、二叉树先序遍历

1、先序遍历的访问过程(根左右)

(1)先访问根节点
(2)先序遍历根节点的左子树
(3)先序遍历根节点的右子树

2、流程图及原理解释

先序遍历
先序遍历流程图解释:
由于先序遍历先访问的是根节点,所以先访问的是根节点A,再访问左节点B,由于左节点B仍然是一个根节点,所以继续访问的是根节点B的左节点D,由于D没有左右结点,所以再访问B的右节点E。E访问完之后,A的左子树算是全部访问完毕,再访问A的右子树,道理与前述相同,不再重复。

3、前序遍历递归代码
/** 先序遍历*/
void Pre_Order(BinTNode *T1)
{
    if(T1 != NULL)
    {
        printf("%c  ",T1->data);
        Pre_Order(T1->Lchild);
        Pre_Order(T1->Rchild);
    }
}
4、前序遍历练习题(由于图太难画改用手绘^_^嘻嘻)

附带答案大家自己领会(其实是因为我懒)

在这里插入图片描述

二、二叉树中序遍历

1、中序遍历的访问过程(左根右)

(1)中序遍历根节点的左子树
(2)再访问根节点
(3)中序遍历根节点的右子树

2、流程图及原理解释

在这里插入图片描述
中序遍历流程图解释:
由于中序遍历先访问的是左节点,所以从最左边的开始遍历,即从D开始遍历。然后再访问D的根节点E.此时根节点A的左子树已经访问完毕,然后再访问左子树的根节点也就是A,然后再按照左根右的顺序继续访问右子树。这里不再重复。

3、中序遍历递归代码
/** 中序遍历*/
void Mid_Order(BinTNode *T1)
{
    if(T1 != NULL)
    {
        Mid_Order(T1->Lchild);
        printf("%c  ",T1->data);
        Mid_Order(T1->Rchild);
    }
}
4、中序遍历练习题(由于图太难画再次改用手绘^_^嘻嘻)

附带答案大家自己领会(其实是因为我懒)

在这里插入图片描述

三、二叉树后序遍历

1、后序遍历的访问过程(左右根)

(1)后序遍历根节点的左子树
(2)后序遍历根节点的右子树
(3)最后访问根节点

2、流程图及原理解释

在这里插入图片描述
后序遍历流程图解释:
由于后序遍历根节点是最后访问所以先访问D,然后访问B的右子树也就是E,左右子树都访问完之后再访问二者的根节点B,此时不是立即访问根节点A,而是访问A的右子树,直到左右子树都访问完毕后,再访问根结点A。

3、后序遍历递归代码
/** 后序遍历*/
void Beh_Order(BinTNode *T1)
{
    if(T1 != NULL)
    {
        Beh_Order(T1->Lchild);
        Beh_Order(T1->Rchild);
        printf("%c  ",T1->data);
    }
}
4、后序遍历练习题(由于图太难画还是改用手绘^_^嘻嘻)

附带答案大家自己领会(其实是因为我懒)
在这里插入图片描述

四、已知两种遍历求另外一种遍历(也是求原二叉树)

1、已知先序和中序求原二叉树并写出后序

先序:ABCDEFGH
中序:BDCEAFHG
解题步骤:(中序确定左右子树、先序确定根节点
①首先确定根节点 先序中最先出现的是根节点 所以确定A是根节点
②根据中序确定根节点A的左右子树 BDCE是A的左子树 FHG是A的右子树
③然后与A相连的左子树的根节点是什么呢?刚才说到越靠前的越是根节点,所以A的左子树的根节点是在先序中最先出现的B,然后再根据中序可以知道DCE是B的右子树,那么该右子树的根结点有是什么,再次回到先序中确定C是一个根节点。以此类推、、、、、
在这里插入图片描述
所以答案是:后序 DECBHGFA

2、已知中序和后序求原二叉树并写出前序

中序:BDCEAFHG
后序:DECBHGFA
解题步骤:(中序确定左右子树、后序确定根节点
①首先确定根节点 后序中最晚出现的是根节点 所以确定A是根节点
②根据中序确定根节点A的左右子树 BDCE是A的左子树 FHG是A的右子树
③然后与A相连的左子树的根节点是什么呢?刚才说到越靠后的越是根节点,所以A的左子树的根节点是在后序中最晚出现的B,然后再根据中序可以知道DCE是B的右子树,那么该右子树的根结点有是什么,再次回到后序中确定C是一个根节点。以此类推、、、、、
在这里插入图片描述
所以答案是:先序 ABCDEFGH

小伙伴们如果还有问题可以加 企鹅1577655659 继续讨论哦!
溜了溜了~~

### C语言实现二叉树、中后序遍历完整代码示例 以下是一个完整的C语言程,用于实现二叉树、中后序遍历。代码中定义了二叉树节点结构,并提供了递归方式实现三种遍历方法。 ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树节点结构 struct TreeNode { char data; struct TreeNode* leftChild; struct TreeNode* rightChild; }; // 创建新节点 struct TreeNode* createNode(char data) { struct TreeNode* newNode = (struct TreeNode*)malloc(sizeof(struct TreeNode)); newNode->data = data; newNode->leftChild = NULL; newNode->rightChild = NULL; return newNode; } // 遍历:根节点 -> 左子树 -> 右子树 void preOrder(struct TreeNode* root) { if (root == NULL) return; printf("%c ", root->data); // 访问当前节点 preOrder(root->leftChild); // 递归访问左子树 preOrder(root->rightChild); // 递归访问右子树 } // 中遍历:左子树 -> 根节点 -> 右子树 void inOrder(struct TreeNode* root) { if (root == NULL) return; inOrder(root->leftChild); // 递归访问左子树 printf("%c ", root->data); // 访问当前节点 inOrder(root->rightChild); // 递归访问右子树 } // 后序遍历:左子树 -> 右子树 -> 根节点 void postOrder(struct TreeNode* root) { if (root == NULL) return; postOrder(root->leftChild); // 递归访问左子树 postOrder(root->rightChild); // 递归访问右子树 printf("%c ", root->data); // 访问当前节点 } // 主函数测试 int main() { // 构建一个简单的二叉树 struct TreeNode* root = createNode('A'); root->leftChild = createNode('B'); root->rightChild = createNode('C'); root->leftChild->leftChild = createNode('D'); root->leftChild->rightChild = createNode('E'); root->rightChild->leftChild = createNode('F'); printf("遍历结果: "); preOrder(root); printf("\n"); printf("中遍历结果: "); inOrder(root); printf("\n"); printf("后序遍历结果: "); postOrder(root); printf("\n"); return 0; } ``` #### 说明 1. **遍历**:按照“根节点 -> 左子树 -> 右子树”的顺进行访问[^1]。 2. **中遍历**:按照“左子树 -> 根节点 -> 右子树”的顺进行访问[^1]。 3. **后序遍历**:按照“左子树 -> 右子树 -> 根节点”的顺进行访问。 上述代码中,`createNode` 函数用于创建一个新的二叉树节点,`preOrder`、`inOrder` `postOrder` 分别实现了、中后序遍历的功能。 --- ###
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值