首先我们对二叉树的结构进行设计,以’#'作为结束符,对类型进行重定义。
#define END '#'
typedef char ElemType;
二叉链表的结构设计:
typedef struct BtNode//BinaryTreeNode
{
struct BtNode* leftchild;//左孩子节点
struct BtNode* rightchild;//右孩子节点
ElemType data;//数据域
}BtNode,*BinaryTree;
三叉链表的结构设计:
typedef struct BtNode//BinaryTreeNode
{
struct BtNode* leftchild;//左孩子节点
struct BtNode* parent;//双亲指针
struct BtNode* rightchild;//右孩子节点
ElemType data;//数据域
}BtNode,*BinaryTree;
二叉树的遍历:
所谓树的遍历,就是按照某种次序遍历树中的节点,要求每个节点访问仅且访问一次。
设访问根节点记作V,遍历根的左子树记作L,遍历根的右子树记作R,则有以下几种遍历方式:
下面是前序遍历、中序遍历以及后序遍历的规则:
按照上面规则,我们给出下面这颗二叉树的前序、中序以及后序遍历:
其前序遍历为:ABCDEFGH
中序遍历为:CBEDFAGH
后序遍历为:CEFDBHGA
下面我们来给出中序遍历的代码:
void InOrder(BtNode* p)
{
if (p != NULL)
{
InOrder(p->leftchild);
printf("%c ", p->data);
InOrder(p->rightchild);
}
}
前序遍历代码:
void FrontOrder(BtNode* p)
{
if (p != NULL)
{
printf("%c ", p->data);
FrontOrder(p->leftchild);
FrontOrder(p->rightchild);
}
}
后序遍历代码:
void EndOrder(BtNode* p)
{
if (p != NULL)
{
EndOrder(p->leftchild);
EndOrder(p->rightchild);
printf("%c ", p->data);
}
}