二叉树遍历的四种方式(先序、中序、后序、层序)

二叉树的遍历

    • 遍历方式
      • 先序遍历
        • 先序递归遍历
      • 中序遍历
        • 中序递归遍历
      • 后序遍历
        • 后序递归遍历
      • 层次遍历
    • 由遍历序列构造二叉树

遍历方式

有四种遍历方式:先序遍历、中序遍历、后序遍历、层次遍历

先序遍历

规则:
①访问根节点
②先序遍历左子树
③先序遍历右子树

先序递归遍历

void preOrder(BiTree B){
    if(B != NULL){
        printf("先序访问结点 %c\n",B->data);
        preOrder(B->lchild);
        preOrder(B->rchild);
    }
}

中序遍历

规则:
①中序遍历左子树
②访问根节点
③中序遍历右子树

中序递归遍历

void InOrder(BiTree B){
    if(B != NULL){
        InOrder(B->lchild);
        printf("中序访问结点 %c\n",B->data);
        InOrder(B->rchild);
    }
}

后序遍历

规则:
①后序遍历左子树
②后序遍历右子树
③访问根节点

后序递归遍历

void PostOrder(BiTree B){
    if(B != NULL){
        PostOrder(B->lchild);
        PostOrder(B->rchild);
        printf("后续访问结点 %c\n",B->data);
    }
}

层次遍历

规则:
按每层的顺序,从左到右依次访问结点

思路:
利用队列完成层次遍历。

先让根节点入队,判断队列是否为空
不为空,弹出队头元素,访问弹出元素;若弹出元素有左右子树,将左右子树依次入队,
依次重复,直至队空。

void levelOrder(BiTree B){
    SqQueue Q;
    //初始化队列
    initQueue(Q);
    //根节点入队
    enQueue(Q,B);
    while(Q.length != 0){
        BiTree P = outQueue(Q);
        printf("出队元素 %c\n",P->data);
        if(P->lchild != NULL){
            enQueue(Q,P->lchild);
        }
        if(P->rchild != NULL){
            enQueue(Q,P->rchild);
        }
    }
}

由遍历序列构造二叉树

二叉树的先序遍历和中序遍历可以唯一确定一棵二叉树;
二叉树的后序遍历和中序遍历可以唯一确定一棵二叉树;
二叉树的层序遍历和中序遍历可以唯一确定一棵二叉树;

只有先序序列和后序序列无法唯一确定一棵二叉树。

你可能感兴趣的:(数据结构)