1:抽象数据类型定义
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
2:先序创建二叉树
核心思想:利用递归,输入ch,#代表空节点。
void CreateBitree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
T = NULL;
else
{
T = (BiTNode *)malloc(sizeof(BiTNode));
T->data = ch;
CreateBitree(T->lchild);
CreateBitree(T->rchild);
}
return OK;
}
3:先序递归遍历二叉树
核心思想:如果T不为空,则先打印出节点元素,再进行递归左子树,右子树。
void PreOrderTra(BiTree *T)
{
if(T)
{
printf("%c",T->data);
PreOrderTra(T->lchild);
PreOrderTra(T->rchild);
}
}
中序和后序递归遍历算法思想与先序相同,只需要调换了printf位置既可。
4:先序,中序非递归遍历二叉树
核心思想:转载请注明出处:(39条消息) 二叉树的非递归前序、中序、后序遍历算法详解及代码实现(C语言)_Benja_K的博客-CSDN博客_二叉树的先序,中序,后序遍历c语言
遍历过程:
入栈时访问节点内容,则为前序遍历;出栈时访问,则为中序遍历。
利于理解的伪代码:
void preOrder(BiTree *T){
p = T
while(p不空||栈不空){
if(p不空){ //两种情况:1.栈不空;2.栈空
p入栈;
(前序遍历,访问)
入p左子节点;
}else{ //一种情况:当前节点为空,但栈不空
p=出栈;
(中序遍历,访问)
入p右子节点;
}
}
}
具体代码如下:
void preOrder(BiTree *T)
{
BiTree *stack[15];
int top = -1;
BiTree *p = T;
while(p!=NULL||top!=-1)
{
if(p!=NULL){
stack[++top] = p;
printf("%c\t",p->data);
p = p->lchild;
}
else{
p = stack[top--];
p = p->rchild;
}
}
}
中序遍历只需要将printf语句换到else语句里面即可。
6:二叉树层次遍历
核心思想:构建一个队列,pre指向头结点,从头节点开始进入while循环,打印出根节点后,遍历左孩子,不为空则存入队列中,同理在遍历右节点。如果front与real相同也就意味着队列为空,退出while循环层次遍历结束。
void levelOrder(BiTree *T)
{
BiTree stack[15];
int front=real=0;
BiTree *cur,*pre;
pre = T;
while(pre!=NULL)
{
printf("%c",pre->data);
cur = pre->lchild;
if(cur!=NULL){
stack[real++] = cur;
}
cur = pre->rchild;
if(cur!=NULL){
stack[real++] = cur;
}
if(front!=real)
pre = stack[front++];
else
pre = NULL;
}
}