二叉树的遍历

本文详细介绍了四种二叉树的非递归遍历方法:先序遍历利用栈将根节点入栈,然后依次处理节点的右、左孩子;中序遍历通过栈保存上一个节点,先遍历左子树,遇到叶子节点后输出;后序遍历使用两个栈,通过交换左右子树得到倒置的先序遍历序列;层次遍历借助队列实现,逐层处理节点。
摘要由CSDN通过智能技术生成

二叉树的遍历

说一下四个非递归遍历的思路。
先序的非递归遍历最好理解,先将根节点节点入栈,进入循环,将栈顶元素出栈,输出节点数据,然后将出栈节点右孩子入栈,再压入左孩子,这样的顺序入站之后栈顶节点就是上一个节点的左孩子。重复这个过程直到栈空遍历完成。

中序的非递归遍利用一个栈保存上一个节点,首先左子树一路走到底,遇到叶子节点之后栈顶元素弹出,然后将将弹出的节点的右子树入栈。

后序遍历用了两个栈,我们先看一下图中的二叉树
图:在这里插入图片描述
该二叉树的先序遍历为:1 2 3 4 5 6 7 8 9
后序遍历为:4 3 6 5 2 8 9 7 1
后序遍历的倒置序列是:1 7 9 8 2 5 6 3 4,仔细观察该序列就会发现它是上图中的二叉树交换左右子树之后的先序遍历。所以我们只需要将该序列倒置就能够得到后序遍历的序列里。所以后序遍历这里使用了两个栈,因为是交换左右子树所以使用反过来的先序遍历,但是不需要输出,只需要将栈一弹出的数据压入栈二。等遍历结束之后输出栈二内的数据。

层次遍历的非递归使用队列来实现代码和先序遍历差不多,先将根节点入队,取队头结点输出节点数据,将对头结点出队,然后将出队的节点的左孩子入队,在将其右孩子入队,如果画出队列中的数据情况会发现,每一层节点有从左之后在队列里,只需要一个个出队输出就可以了。

#include <iostream>
#include <stack>
#include <queue>
using namespace std;
//节点类型
struct Node
{
   
    int data;
    Node *lchild,*rchild;
};

//建树
void CreateTree(Node* &root)
{
   
    int data;
    cin>>data;
    if(data==-1)
    {
   
        root=nullptr;
    }
    else
    {
   
        root=new Node();
        root->data=data;
        CreateTree(root->lchild);
        CreateTree(root->rchild);
    }
}
//前序递归
void PreOrderWithRecursive(Node *root)
{
   
    if(root==nullptr)
        return;
    else
    {
   
        cout<<root->data<<" "
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值