从0开始学习数据结构-树与二叉树-二叉树与树的遍历

148 阅读2分钟

这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战

树的遍历: 按一定顺序对树中每个结点逐个进行访问一次,用以查找具有某一特点的结点或者全部结点,然后对这些满足条件的结点进行处理,这种操作就是树的遍历。

二叉树的遍历

  • 前序遍历 原则是:若被遍历的二叉树非空,则按如下顺序进行遍历:
    • 访问根结点
    • 以前序遍历方式遍历根结点的左子树
    • 以前序遍历方式遍历根结点的右子树

遍历过程是个递归过程,主要表现在遍历任何一棵子树时仍然是先访问子树的根结点,然后遍历子树根结点的左子树,最后遍历子树根结点的右子树。即在前序遍历过程中,对结点的处理是在它的孩子结点被处理之前进行的

void PREORDER(BTREE T)
{
    // T为二叉树根结点所在链结点的地址
    if (T != NULL) {
        VISIT(T); // 访问T所指结点
        PREORDER(T->lchild); // 遍历T所指结点的左子树
        PREORDER(T->rchild); // 遍历T所指结点的右子树
    }
}
  • 中序遍历 原则是:若被遍历的二叉树非空,则按如下顺序进行遍历
    • 以中序遍历方式遍历根结点的左子树
    • 访问根结点
    • 以中序遍历方式遍历根结点的右子树
void INORDER(BTREE T)
{
    // T为二叉树根结点所在链结点的地址
    if (T != NULL) {
        INORDER(T->lchild); // 遍历T所指结点的左子树
        VISIT(T); // 访问T所指结点
        INORDER(T-rchild); // 遍历T所指结点的右子树
    }
}
  • 后序遍历 原则是:若被遍历的二叉树非空,则按如下顺序进行遍历
    • 以后序遍历方式遍历根结点的左子树
    • 以后序遍历方式遍历根结点的右子树
    • 访问根结点
void POSTORDER(BTREE T)
{
    // T为二叉树根结点所在链结点的地址
    if (T != NULL) {
        POSTORDER(T->lchild); // 遍历T所指结点的左子树
        POSTORDER(T->rchild); // 遍历T所指结点的右子树
        VISIT(T); // 访问T所指结点
    }
}

二叉树的等价性

  • 二叉树的相似问题
  • 等价性问题 如果说二叉树T1与二叉树T2是相似的,则是指他们具有相同的拓扑结构。也就是说,要么它们都是空二叉树,要么它们都不空,并且它们的左、右子树都分别相似。