二叉树
二叉树结构定义如下
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
ElementType Data;
BinTree Left;
BinTree Right;
};
四种遍历方式分别是 中序,先序,后序,层序。
具体例子如下:
二叉树图解:
四种遍历输出:
Inorder: D B E F A G H C I //中序
Preorder: A B D F E C G H I //先序
Postorder: D E F B H G I C A //后序
Levelorder: A B C D F G I E H //层序
先序,中序,后序
都是用递归输出,只是根,左节点,右节点的输出顺序不一样
void InorderTraversal( BinTree BT ){//中序
if(!BT)
return;
InorderTraversal(BT->Left);
printf(" %c",BT->Data);
InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ){ //先序
if(!BT)
return;
printf(" %c",BT->Data);
PreorderTraversal(BT->Left);
PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ){//后序
if(!BT)
return;
PostorderTraversal(BT->Left);
PostorderTraversal(BT->Right);
printf(" %c",BT->Data);
}
层序
需要定义两个数组存节点,一个存当前节点并输出data,另一个存这个节点下的左右节点。
void LevelorderTraversal( BinTree BT ){//层序
if(!BT)
return;
int len=1,pos;
BinTree a[101],b[101];
a[0]=BT;
while(1){
if(len==0)
return;
pos=0;
for(int i=0;i<len;i++)
{
if(a[i]!=NULL)//不为空输出
printf(" %c",a[i]->Data);
if(a[i]->Left!=NULL)//如果它的左节点不为空,就存到b数组里
b[pos++]=a[i]->Left;
if(a[i]->Right!=NULL)//如果它的右节点不为空,就存到b数组里
b[pos++]=a[i]->Right;
}
len=pos;//更新下一层宽度,为下一次循环做准备
for(int i=0;i<len;i++)//将下层的b赋给a,为下一次循环做准备
a[i]=b[i];
}
}