先 说说 几种遍历方式把
先序遍历:访问根结点 ;先序遍历左子树,先序遍历右子树。
顺序: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)是不会被执行的,只有读到@,上一句的递归结束,才会执行第二条递归语句生成右边的节点(树)。