二叉树的结构定义:
#define MAXSIZE 100
typedef char dataType;
struct TreeNode{
dataType data;
TreeNode *left, *right;
};
创建二叉树:
//输入示例:AB##C##
//创建二叉树
//以先序序列输入各节点的数据,某节点的左子树或右子树为空时,输入一个特殊的值 x
void createTree(TreeNode *&t, dataType x){
dataType d;
scanf("%c", &d);
if(d == x){
t = NULL;
}else{
t = (TreeNode *)malloc(sizeof(TreeNode));
t-> data = d;
createTree(t-> left, x);
createTree(t-> right, x);
}
}
前序递归遍历二叉树:
void preOrder(TreeNode *root)
{
if (root == NULL)//递归调用的结束条件
return;
else
{
printf("%c ", root->data);
preOrder(root->lchild);
preOrder(root->rchild);
}
}
中序递归遍历二叉树:
void inOrder(TreeNode *root)
{
if (root == NULL)//递归调用的结束条件
return;
else
{
inOrder(root->lchild);
printf("%c ", root->data);
inOrder(root->rchild);
}
}
后序递归遍历二叉树:
void postOrder(TreeNode *root)
{
if (root == NULL) //递归调用的结束条件
return;
else
{
postOrder(root->lchild);
postOrder(root->rchild);
printf("%c ", root->data);
}
}
层序递归遍历二叉树:
层序遍历算法:
在进行层序遍历时,访问某一层的结点后,再对各个结点的左孩子和右孩子顺序访问。
这样一层一层遍历,向访问的结点其左右孩子也要先遍历,这符合队列的操作特性。
因此,在进行层序遍历时,设置一个队列存放已访问的结点。
void levelOrder(TreeNode *root)
{
TreeNode *q = NULL;//创建工作指针
TreeNode *Queue[MAXSIZE];//创建存放根节点的顺序队列
int front;//队头
int rear;//队尾
front = rear = -1;
if (root == NULL)//判断是否为空树
{
return;
}
Queue[++rear] = root;//跟结点入队
while (front != rear)
{
q = Queue[++front];//根节点出队
printf("%c ", q->data);
if (q->left)
{
Queue[++rear] = q->left;//左子树入队
}
if (q->right)
{
Queue[++rear] = q->right;//右子树入队
}
}
}