【二叉树】如何通过(前序|后序)和中序确定一个二叉树

一、二叉树的性质

性质参考:
数据结构与算法之二叉树大全
二叉树的五个性质

  1. 二叉树的第 i 层 ( i > 0)上至多有 2i-1 个结点
  2. 深度为 k ( k > 0)的二叉树至多有 2k-1 个结点
  3. 任意一棵二叉树,如果其叶子结点数为N0,度数为2的结点数为N2,则N0=N2+1;
  4. 具有n个结点的完全二叉树的深度必为 log2(n+1) (向下取整)
  5. 对于完全二叉树,若从上至下、从左至右编号,则编号为i 的结点,其左孩子编号必为2i,其右孩子编号必为2i+1;其双亲的编号必为i/2(i=1 时为根,除外)

二、通过一个二叉树写出它的四种遍历顺序

【数据结构】二叉树的遍历顺序

三、如何通过中序和(前序|后序)画出二叉树

例子:
前序:A B C D E F G H I
中序:B D C A E H G I F

第一步

  1. 前序遍历口诀:根左右,所以A是根结点
    中序遍历口诀:左根右,所有BDC是左子树,EHGIF是右子树(如下图)
    在这里插入图片描述

  1. 先看左子树BCD——
    在这里插入图片描述
    由前序可以确定B是BCD的根结点,
    带入中序的左根右口诀,可以得出B结点无左子树,有右子树DC(如下图)
    在这里插入图片描述

  1. 再看DC——
    在这里插入图片描述
    由前序遍历顺序:根左右,可以确定C是CD的根结点,
    带入中序的左根右口诀,可以得出C结点的左子树为D,无右子树(如下图)
    在这里插入图片描述

  1. 然后回到A结点,看它的右子树EHGIF

    在这里插入图片描述
    同样根据前序根左右,可以确定E是EHGIF的根结点,
    带入中序的左根右口诀,可以得出E结点无左子树,右子树为HGIF(如下图)
    在这里插入图片描述


  1. 继续看HGIF——
    在这里插入图片描述
    可以确定F是HGIF的根结点,
    带入中序可以得出F结点左子树为HGI,无右子树(如下图)
    在这里插入图片描述

6.继续看HGI
在这里插入图片描述
由前序可以确定G是HGI的根结点,
带入中序可以得出G结点左子树为H,右子树为I(如下图),至此完成。
在这里插入图片描述


总结:
当题目为 “通过后序和中序得出二叉树” 时,
也是同样道理,因为前序和后序只负责确定一个根,中序负责找出这个根的左右子树

但是如果只有前序和后序就无法确定一个唯一的二叉树,因为无法确定根的左右子树。

待补充。。。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,以下是C语言输出二叉树前序中序后序遍历的代码: ```C #include <stdio.h> #include <stdlib.h> typedef struct TreeNode{ int val; struct TreeNode* left; struct TreeNode* right; }TreeNode; //前序遍历 void preorderTraversal(TreeNode* root) { if(root == NULL) return; printf("%d ", root->val); preorderTraversal(root->left); preorderTraversal(root->right); } //中序遍历 void inorderTraversal(TreeNode* root) { if(root == NULL) return; inorderTraversal(root->left); printf("%d ", root->val); inorderTraversal(root->right); } //后序遍历 void postorderTraversal(TreeNode* root) { if(root == NULL) return; postorderTraversal(root->left); postorderTraversal(root->right); printf("%d ", root->val); } int main() { // 构建一棵二叉树 TreeNode* root = (TreeNode*)malloc(sizeof(TreeNode)); root->val = 1; TreeNode* left = (TreeNode*)malloc(sizeof(TreeNode)); left->val = 2; TreeNode* right = (TreeNode*)malloc(sizeof(TreeNode)); right->val = 3; TreeNode* left_left = (TreeNode*)malloc(sizeof(TreeNode)); left_left->val = 4; TreeNode* left_right = (TreeNode*)malloc(sizeof(TreeNode)); left_right->val = 5; TreeNode* right_left = (TreeNode*)malloc(sizeof(TreeNode)); right_left->val = 6; TreeNode* right_right = (TreeNode*)malloc(sizeof(TreeNode)); right_right->val = 7; root->left = left; root->right = right; left->left = left_left; left->right = left_right; right->left = right_left; right->right = right_right; printf("前序遍历结果: "); preorderTraversal(root); printf("\n中序遍历结果: "); inorderTraversal(root); printf("\n后序遍历结果: "); postorderTraversal(root); printf("\n"); return 0; } ``` 以上代码可以测试输出一棵二叉树前序中序后序遍历结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葫芦娃子救我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值