二叉树的递归遍历及知前中序列遍历求后序遍历

一、二叉树的遍历
一棵二叉树由根结点、左子树和右子树三部分组成,因此依次遍历三部分可以遍历整个二叉树。若用D、L、R分别访问二叉树的根结点、左子树和右子树,遍历方式有DLR、LDR、LRD、DRL、RDL、RLD六种。这里先访问左子树再访问右子树。
有三种
先序遍历:DLR
中序遍历:LDR
后序遍历:LRD

#include<stdio.h>
#include<malloc.h>
typedef int TElemtype;
typedef struct BiTNode
{
 TElemtype data;
 struct BiTNode *leftchild, *rightchild;
}BiTNode, *BiTree;
//创建二叉树
BiTree creatBiTree()
{
 BiTree T;
 TElemtype e;
 scanf("%d",&e);
 if (e == 0)
 {
  T = NULL;
 }
 else
 {
  T = (BiTree)malloc(sizeof(BiTNode));
  T->data = e;
  T->leftchild = creatBiTree();
  T->rightchild = creatBiTree();
 }
 return T;
}
//先序遍历 
void PreOrderTraverse(BiTree T)
{
 if (T == NULL)
 {
  return;
 }
 printf("%d", T->data);
 PreOrderTraverse(T->leftchild);
 PreOrderTraverse(T->rightchild);
}
//中序遍历 
void InOrderTraverse(BiTree T)
{
 if (T == NULL)
 {
  return;
 }
 InOrderTraverse(T->leftchild);
 printf("%d", T->data);
 InOrderTraverse(T->rightchild);
}
//后序遍历 
void PostOrderTraverse(BiTree T)
{ if (T == NULL)
 {
  return;
 }
 PostOrderTraverse(T->leftchild);
 PostOrderTraverse(T->rightchild);
 printf("%d", T->data);
}
int main()
{ BiTree T;
 printf("建立二叉树:");
 T=creatBiTree();
 printf("先序遍历:");
 PreOrderTraverse(T);
 printf("\n");
 printf("中序遍历:");
 InOrderTraverse(T);
 printf("\n");
 printf("后序遍历:");
 PostOrderTraverse(T);
 printf("\n");
}
//1 2 4 0 5 0 0 6 0 0 3 7 0 0 8 0 0

在这里插入图片描述

二、已知前序和中序遍历,求后序遍历
以上面的二叉树为例子。
前序遍历为:12456378
中序遍历为:45261738

1.由前序遍历可知1为根结点,由中序遍历可知道4526为左子树,738为右子树。
2.由前序遍历可知2为左子树的根结点,3为右子树的根结点。
3.再由中序遍历可知4或5为左子树的左结点,6为左子树右结点,再看前序遍历,4为左子树的左结点,所以5就为4的右结点。
4.同理遍历右子树,由中序遍历,7为3的左结点,8为3的右结点。
可以得到下面的二叉树

在这里插入图片描述

在这里插入图片描述

后序遍历就为 5 4 6 2 7 8 3 1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值