二叉树的遍历
- 遍历:按照某种次序把所有的结点都访问一遍
- 层次遍历:基于树的层次特性确定的次序规则
- 先/中/后序遍历:基于属的递归特性确定的次序规则
一、先序遍历(根左右)
分支结点逐层展开法
操作:
-
若二叉树为空,则什么都不做
-
若非空:
①访问根节点;②先序遍历左子树;③先序遍历右子树
-
小方法:
从根结点出发,画一条路:如果左边还有没走的路,优先往左走,走道路的尽头(空结点)就往回走,如果左边没路了,就往右走,如果左、右都没路了,就往上走
先序遍历–第一次路过时访问节点(每个结点都会被路过3次)
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序遍历
void PreOrder(BiTree T){
if(T!=NULL){
visit(T); //访问根节点
PreOrder(T->lchild); //递归遍历左子树
PreOrder(T->rchild); //递归遍历右子树
}
}
二、中序遍历(左根右)
中序遍历–第二次路过时访问节点(每个结点都会被路过3次)
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序遍历
void PreOrder(BiTree T){
if(T!=NULL){
PreOrder(T->lchild); //递归遍历左子树
visit(T); //访问根节点
PreOrder(T->rchild); //递归遍历右子树
}
}
三、后序遍历(左右根)
后序遍历–第三次路过时访问节点(每个结点都会被路过3次)
typedef struct BiTNode{
ElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//先序遍历
void PreOrder(BiTree T){
if(T!=NULL){
PreOrder(T->lchild); //递归遍历左子树
PreOrder(T->rchild); //递归遍历右子树
visit(T); //访问根节点
}
}
以上三种方法,空间复杂度为O(h)
四、遍历算法的应用举例
- 求树的深度
int treeDepth(BiTree T){
if(T==NULL){
return 0;
}
else{
int l = treeDepth(T->lchild);
int r = treeDepth(T->rchild);
//树的深度=Max(左子树深度,右子树深度)+1
return l>r ? l+1 : r+1;
}
}