以这颗树为例:#表示空节点
前序遍历(根->左->右)为:ABD##E##C#F##
中序遍历(左->根->右)为:#D#B#E#A#C#F#
后序遍历(左->右->根)为:##D##EB###FCA
#include <stdio.h> #include <stdlib.h> typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; void ForEachTree(BiTree T) { if(T == NULL){ return; } // printf(" %c ",T->data);前序遍历 ForEachTree(T->lchild); printf(" %c ",T->data);//中序遍历 ForEachTree(T->rchild); // printf(" %c ",T->data);后序遍历 } void CreateBiTree(BiTree *T) { TElemType ch; scanf("%c",&ch); if('#' == ch){ *T = NULL; }else{ *T = (BiTree)malloc(sizeof(BiTNode)); (*T)->data = ch; CreateBiTree(&(*T)->lchild); CreateBiTree(&(*T)->rchild); } } void main(){ //前序创建树,中序输出树 BiTree T;//根节点 CreateBiTree(&T); ForEachTree(T); }
java版本实现:
由于java没有c的指针,所以相对于c来说实现起来比较别扭,但思路没问题
在java中,不管这个节点是不是空节点,都会申请空间,只不过这个节点的数据、左子树、右子树都是null,但这个节点不是null,如下图
public class BiThrTree { public void createTree(BiThrNode T){ String str; str = new Scanner(System.in).next(); if("#".equals(str)){ //如果是'#',则不做任何处理,也就是说这个节点的数据、左孩子、右孩子都是null //但这个节点不是null,这里需要注意 }else{ T.data = str;//给节点赋值 T.lchild = new BiThrNode(); T.rchild = new BiThrNode(); createTree(T.lchild); createTree(T.rchild); } } public void forEachTree(BiThrNode T){ if(T.data == null){//判断这个节点的数据是否为空 return; } forEachTree(T.lchild); forEachTree(T.rchild); System.out.print(T.data);//后序遍历 } public static void main(String[] args) { BiThrNode T = new BiThrNode(); new BiThrTree().createTree(T); new BiThrTree().forEachTree(T); } } class BiThrNode{ String data; BiThrNode lchild; BiThrNode rchild; }