16 - 11 - 16 二叉树(C)生成之--终极奥义--书上没讲的!!

先 说说 几种遍历方式把
这里写图片描述
先序遍历:访问根结点 ;先序遍历左子树,先序遍历右子树。
顺序:A B D G E H I C F J
中序遍历:中序遍历左子树,访问根节点,中序遍历右子树
例如,如果要中序遍历A的左子树{B D E G H I},根据中序遍历的递归定义,要先中序遍历B的左子树{D G},然后再访问根节点B,访问完根节点B后,中序遍历B的右子树。注意,这里的根节点都是相对的。D也是根节点,但D没有左子树,所以先是D G
中序也有一个比较好的方法是 虚拟补全,假装补全了所有树。
顺序:D G B E H I A F J C
后序遍历:的后序遍历左子树,后序遍历右子树,访问根节点。
也是补全补成丰满树就大大降低了难度
顺序:G D H I E B J F C A
*这里的前中后是根据 根节点 相对于左子树和右子树的相对位置来划分的。

重要:程序默认按照先序顺序来生成一个树

下面是一个二叉树的创建代码

#include <stdio.h>
#include <stdlib.h>    //malloc 
#define MAX_BITREE_SIZE 20
typedef struct BiTNode {
    char data;
    struct BiTNode *lchild, *rchild;     /*左右孩子指针*/
} BiTNode, *BiTree;     //Bi是binary:二进位的,二元的。

void Create_BiTree(BiTree *T) {
    /*构造二叉树的二叉链表 T */
    char ch;
    ch=getchar();
    if(ch=='@')
        *T=NULL;
    else {
        *T=(BiTree)malloc(sizeof(BiTNode));                     (*T)->data=ch;     /*生成根节点*/            //1、
         Create_BiTree(&(*T)->lchild);  /*构造左子树*/  //2、
        Create_BiTree(&(*T)->rchild);  /*构造右子树*/
        /*递归制表*/    //3、关于两个递归
    }
}//把 *T 看成一个整体,*T是一个指向树的指针,。

void PreOrder(BiTree T) {
    /*先序遍历二叉树*/
    if(T)   {
        printf("%3c",T->data);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}

void InOrder(BiTree T) {
    /*中序遍历二叉树*/
    if(T) {
        InOrder(T->lchild);
        printf("%3c",T->data);
        InOrder(T->rchild);
    }
}

void PostOrder(BiTree T) {
    /*后序遍历二叉树*/
    if(T) {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        printf("%3c",T->data);
    }
}


int main() {
    BiTree T,p;
    printf("\n input PreOrder str : ");
    Create_BiTree(&T);  /*建立二叉树 T*/
    printf("\n");
    printf("\n Preorder list of T:");
    PreOrder(T);
    printf("\n inorder list of T:");
    InOrder(T);
    printf("\n postorder list of T:");
    PostOrder(T);
}  

——————————————-代码来源:《数据结构案例教程》

程序输入:
ABD@@@CE@G@@F@@
结果:
input PreOrder str : ABD@@@CE@G@@F@@ (用户输入)

Preorder list of T: A B D C E G F
inorder list of T: D B A E G C F
postorder list of T: D B G E F C A

分析:
//1、:这里的根节点是相对的,度不为0 的节点都可以是根节点。
因为递归,函数不断地创建新的根节点。
//2、:(*T)->lchild是一个整体,代表一个指针,加上一个取地址符&后,就相当于获取这个指针的地址,
而Create_BiTree函数需要 BiTree * 类型的形式参数,也就是需要传入 指针的指针类型。
//3、哈啊啊啊啊啊啊我知道了,输入ABD@@@CE@G@@F@@
系统默认按照先序顺序来创建树,在不输入@之前,程序会一直生成左链,直到读取到一个@,才生成一个右节点,你再看那两个递归函数, 1)Create_BiTree(&(*T)->lchild);
2)Create_BiTree(&(*T)->rchild);
在未读入到@之前, 2)是不会被执行的,只有读到@,上一句的递归结束,才会执行第二条递归语句生成右边的节点(树)。

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值