二叉树的遍历

遍历二叉树就是按一定的次序,系统地访问树中的所有结点,使每个结点恰好被访问一次。所谓访问结点,其含义是很广的,可以理解为对结点的增、删、修改等各种运算的抽象。在本节讨论中,假定访问结点即为输出结点数据域值。二叉树的遍历是最重要和最基本的运算,二叉树的许多操作都是以遍历为基础的。

遍历二叉树的过程实际上就是按某种规律把二叉树的结点排成一个线性序列。由于二叉树是非线性结构,它的每个结点都可能有两个分支,也就是说一个结点可能有两个后继,所以,二叉树的遍历比较复杂,按照不同规则遍历得到的结果也就不同。另L、D、R分别表示遍历左子树、访问根节点和遍历右子树,则对二叉树的遍历有六种规律:DLR、LDR、LRD、DRL、RDL、RLD。若规定先左后右,则只有三种方案:DLR、LDR、LRD,按照访问根的先后,分别称之为二叉树的先序(根)遍历,中序(根)遍历和后序(根)遍历。

二叉树的三种遍历方式:

1) 先序遍历:

若二叉树为空,则空操作;否则:

  • 访问根结点
  • 先序遍历左子树
  • 先序遍历右子树
void preorder(BinaryTree binaryTree)
{
    if (binaryTree) {
        std::cout << binaryTree->data;
        preorder(binaryTree->lchild);
        preorder(binaryTree->rchild);
    }
}

2) 中序遍历:

若二叉树为空,则空操作;否则:

  • 中序遍历左子树
  • 访问根结点
  • 中序遍历右子树
void inorder(BinaryTree binaryTree)
{
    if (binaryTree) {
        inorder(binaryTree->lchild);
        std::cout << binaryTree->data;
        inorder(binaryTree->rchild);
    }
}

 3) 后序遍历:

若二叉树为空,则空操作;否则:

  • 后序遍历左子树
  • 后序遍历右子树
  • 访问根结点
void postorder(BinaryTree binaryTree)
{
    if (binaryTree) {
        std::cout << binaryTree->data;
        postorder(binaryTree->lchild);
        postorder(binaryTree->rchild);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值