二叉树遍历-ag捕鱼王app官网

当前位置:ag捕鱼王app官网 > > 算法 >

二叉树遍历

作者:迹忆客 最近更新:2023/03/26 浏览次数:

二叉树是一种非线性数据结构。它被称为二叉树,因为每个节点最多只有两个子节点。这些子节点被称为左子和右子。它也可以解释为一个不定向图,其中最上面的节点称为根。与线性数据结构只能以一种方式遍历不同,树可以以不同的方式遍历。我们可以通过沿着深度或广度进行探索来遍历一棵树。第一种方法叫做深度优先遍历,第二种方法叫做广度优先遍历。在本文中,我们将讨论深度优先遍历。

深度优先遍历有 3 种-中序遍历、前序遍历和后序遍历。我们将逐一讨论它们。

二元树遍历

中序遍历

在这个遍历中,我们首先访问左子树,然后是根,最后是右子树。每个节点都类似于一个子树。对于 bst,中序遍历按升序返回所有的元素

前序遍历

在这个遍历中,我们首先访问根,然后是左边的子树,最后是右边的子树。每个节点都类似于一个子树。它通常用于复制,即创建树的副本。前缀遍历也有助于从表达式树生成前缀表达式。

后序遍历

在这个遍历中,我们首先访问左子树,然后是右子树,最后是根。每一个节点都类似于一个子树。它被用来有效地删除树。它还有助于从表达式树生成后缀表达式。

二元树遍历图解

二叉树

中序遍历:(4、2、1、5、3、6、7、8、9)

我们在根节点 3 上调用中序遍历。递归向左遍历到达节点 4,它是最左的节点,并将其包含在我们的输出中;由于它是根节点,没有左节点,我们访问它最右的节点 2,并将其包含在我们的遍历中。这样,我们遍历整棵树,得到上述顺序作为我们的输出。

前序遍历:(3,1,4,2,5,7,6,9,8)

我们在根节点 3 上调用前序遍历,并将其包含在我们的输出中。然后我们向左递归遍历到下一个根节点 1,然后是 4。由于 4 没有左边的子节点,我们访问右边的节点 2。现在我们已经覆盖了根节点 4 下的子树,我们回溯到节点 1,并向右走到节点 5。这样,我们遍历整棵树,得到上述顺序作为我们的输出。

后序遍历:(2,4,5,1,6,8,9,7,3)

我们在根节点 3 上调用后序遍历,向左递归遍历到达节点 4。在将 4 纳入我们的遍历之前,我们必须访问它的右边节点 21 的右侧节点 5 未被访问,所以我们先将 5 包括在内,然后将 1 输出。然后我们追溯到根节点 3,并继续遍历右边的子树。这样,我们遍历整棵树,得到上述顺序作为我们的输出。

二叉树遍历算法

中序遍历

  • 通过递归调用 in-order 函数,遍历左侧子树。
  • 访问根节点。
  • 通过递归调用 in-order 函数来遍历右侧子树。

前序遍历

  • 访问根节点。
  • 通过递归调用 in-order 函数来遍历左边的子树。
  • 通过递归调用顺序内函数来遍历右边的子树。

后序遍历

  • 通过递归调用 in-order 函数来遍历左边的子树。
  • 通过递归调用 in-order 函数来遍历右侧子树。
  • 访问根节点。

二叉树遍历的实现

#include using namespace std;
class node {
public:
    int key;
    node *left, *right;
    node(int x) {
        this->key = x;
        this->left = this->right = null;
    }
};
void inorder(node *root) {
    if (root != null)
    {
        inorder(root->left);
        cout << root->key << " ";
        inorder(root->right);
    }
}
void preorder(node*root) {
    if (root != null) {
        cout << root->key << " ";
        preorder(root->left);
        preorder(root->right);
    }
}
void postorder(node* root) {
    if (root != null) {
        postorder(root->left);
        postorder(root->right);
        cout << root->key << " ";
    }
}
int main() {
    node* root = new node(3);
    root->left = new node(1);
    root->right = new node(7);
    root->left->left = new node(4);
    root->left->right = new node(5);
    root->left->left->right = new node(2);
    root->right->left = new node(6);
    root->right->right = new node(9);
    root->right->right->left = new node(8);
    cout << "the inorder traversal of the tree is : "; inorder(root); cout << endl;
    cout << "the preorder traversal of the tree is : "; preorder(root); cout << endl;
    cout << "the postorder traversal of the tree is : "; postorder(root); cout << endl;
}

二叉树遍历算法的复杂度

时间复杂度

  • 平均情况

一棵树上有 n 个节点,在所有 3 种遍历中,我们必须去访问每个节点。由于我们在 n 个节点上迭代,虽然顺序不同,但 3 种遍历的时间复杂度都是 o(n)。平均情况下的时间复杂度是 o(n)

  • 最佳情况

最佳情况下的时间复杂度是 o(n)。它与所有 3 遍历的平均情况时间复杂度相同。

  • 最坏情况

最坏情况下的时间复杂度是 o(n)。它与所有 3 遍历的最坏情况时间复杂度相同。

空间复杂度

由于递归调用所需的额外空间,该算法的空间复杂度为 o(n)

上一篇:循环双向链表

下一篇:二叉搜索树

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

c 中逐级打印二叉树中的数据

发布时间:2023/08/27 浏览次数:205 分类:c

二叉树的逐层遍历称为广度优先遍历。 本教程将教您如何使用 c 逐级打印二叉树中的数据,并让您熟悉执行此任务的不同方法。

java 中的 trie 数据结构

发布时间:2023/08/05 浏览次数:127 分类:java

本文介绍了 java 中的 trie 数据结构。java 中的 trie 数据结构 trie 词是从单词 retrieval 中提取出来的,它是一种用于存储字符串集合的排序数据结构。

在 python 中打印二叉树

发布时间:2023/06/14 浏览次数:195 分类:python

本文将讨论二叉树以及我们如何使用它。 我们还将看到如何使用 python 打印它。我们将了解在处理二叉树时使用的术语。 我们还将研究使用 python 代码的二叉树示例。

将二叉树转换为二叉搜索树

发布时间:2023/03/20 浏览次数:185 分类:算法

本教程教大家如何将二叉树转换为二叉搜索树。二叉树是一种非线性数据结构。它被称为二叉树,因为每个节点最多有两个子节点。这些子节点被称为左子和右子。

二叉搜索树

发布时间:2023/03/20 浏览次数:121 分类:算法

本教程介绍了数据结构 binary search tree。

循环双向链表

发布时间:2023/03/20 浏览次数:169 分类:算法

本教程介绍了循环双向链表的数据结构。

循环链接列表

发布时间:2023/03/20 浏览次数:203 分类:算法

本教程介绍了循环链接列表的数据结构。

发布时间:2023/03/20 浏览次数:104 分类:算法

本教程介绍了双向链接列表的数据结构。

发布时间:2023/03/20 浏览次数:209 分类:算法

本教程告诉我们如何使用合并排序对链接列表进行排序。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便
网站地图