遍历二叉树的代码实现

简介: 遍历二叉树的代码实现

先序遍历(根--左--右)

递归法

void PreOrder(BiTree T){
    if(T != NULL){
        visit(T);                //访问根节点
        PreOrder(T->lchild);    //递归遍历左子树
        PreOrder(T->rchild);    //递归遍历右子树
    }
}

非递归法

void PreOrder(BiTree T){
    InitStack(S);                //使用栈存储二叉树的节点
    BiTree p = T;                //p为遍历二叉树的指针
    while(p || !IsEmpty(S)){    //二叉树不为空或栈不空是继续循环
        if(p != NULL){
            vist(p)                //访问拍p
            Push(S,p);            //p节点入栈
            p = p->lchild;        //继续向左遍历
        }
        else{
            Pop(S,p);            //p出栈
            p = p->rchild;        //转向右子树遍历
        }
    }
}

中序遍历(左--根--右)

递归法

void InOrder(BiTree T){
    if(T != NULL){
        InOrder(T->lchild);        //递归遍历左子树
        visit(T);                //访问根节点
        InOrder(T->rchild);        //递归遍历右子树
    }
}

非递归法

void InOrder(BiTree T){
    InitStack(S);                //使用栈存储二叉树的节点
    BiTree p = T;                //p为遍历二叉树的指针
    while(p || !IsEmpty(S)){    //二叉树不为空或栈不空是继续循环
        if(p != NULL){
            Push(S,p);            //p节点入栈
            p = p->lchild;        //继续向左遍历
        }
        else{
            Pop(S,p);            //p出栈
            visit(p);            //访问p
            p = p->rchild;        //转向右子树遍历
        }
    }
}

后序遍历(左--右--根)

递归法

void PostOrder(BiTree T){
    if(T != NULL){
        PostOrder(T->lchild);        //递归遍历左子树
        PostOrder(T->rchild);        //递归遍历右子树
        visit(T);                    //访问根节点
    }
}

非递归法

void PostOrder(BiTree T){
    InitStack(S);                    //使用栈存储二叉树的节点
    BiTree p = T;                    //p为遍历二叉树的指针
    BiTree r = NULL;                //记录最近访问的节点
    while(p || !IsEmpty(S)){        //二叉树不为空或栈不空是继续循环
        if(p != NULL){
            Push(S,p);                //p节点入栈
            p = p->lchild;            //继续向左遍历
        }
        else{
            GetTop(S,p);            //读取栈顶节点,不出栈
            if(p->rchild && p->rchild != r){    //右子树存在,且未被访问
                p = p->rchild;
                Push(S,p);                        //p节点入栈
                p = p->lchild;                    //转左遍历
            }
            else{
                Pop(S,p);                        //p出栈
                visit(p);                        //访问p
                r = p;                            //记录最近一次访问的节点
                p = NULL;
            }
        }
    }
}

层序遍历

void LevelOrder(BiTree T){
    InitQueue(Q);                //使用队列存储二叉树节点
    BiTree p;
    EnQueue(Q,T);                //根节点入队
    while(!IsEmpty(Q)){            //队列不空继续循环
        DeQueue(Q,p);            //队头节点出队
        vist(p);                //访问队头节点
        if(p->lchild != NULL){
            EnQueue(Q,p->lchild);    //左孩子入队
        }
        if(p->rchild != NULL){
            EnQueue(Q,p->rchild);    //右孩子入队
        }
    }            
}
目录
相关文章
|
4月前
|
存储 算法 C语言
C语言手撕实战代码_二叉树_构造二叉树_层序遍历二叉树_二叉树深度的超详细代码实现
这段代码和文本介绍了一系列二叉树相关的问题及其解决方案。其中包括根据前序和中序序列构建二叉树、通过层次遍历序列和中序序列创建二叉树、计算二叉树节点数量、叶子节点数量、度为1的节点数量、二叉树高度、特定节点子树深度、判断两棵树是否相似、将叶子节点链接成双向链表、计算算术表达式的值、判断是否为完全二叉树以及求二叉树的最大宽度等。每道题目均提供了详细的算法思路及相应的C/C++代码实现,帮助读者理解和掌握二叉树的基本操作与应用。
|
5月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
85 0
|
7月前
|
算法 Java 索引
【算法】重建二叉树并进行后序遍历的Java实现
【算法】重建二叉树并进行后序遍历的Java实现
62 5
|
7月前
|
算法
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
数据结构和算法学习记录——层序遍历(层次遍历)、二叉树遍历的应用(输出二叉树中的叶节点、求二叉树的高度、二元运算表达式树及其遍历、由两种遍历序列确定二叉树)
72 0
|
算法
用递归的思想实现二叉树前、中、后序迭代遍历
用递归的思想实现二叉树前、中、后序迭代遍历
84 1
|
算法
【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)
【算法与数据结构】二叉树的三种遍历代码实现(下)—— 非递归方式实现(大量图解)
83 0
|
存储 算法
【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解
【算法与数据结构】二叉树的三种遍历代码实现(上)—— 用递归序知识点讲解
86 0
|
Java
java实现树的前序遍历,递归和非递归实现(简单明了)
java实现树的前序遍历,递归和非递归实现(简单明了)
111 0
|
算法
力扣704二分查找:思路分析+代码实现(递归与非递归)
力扣704二分查找:思路分析+代码实现(递归与非递归)
145 0
|
前端开发
前端学习案例22-遍历二叉树数据先序遍历2
前端学习案例22-遍历二叉树数据先序遍历2
59 0
前端学习案例22-遍历二叉树数据先序遍历2