二叉树的递归遍历

首先,我们先来说说什么是二叉树。你可以把二叉树想象成一个由节点组成的家族,每个节点可以有最多两个子节点。就像一个家庭里的人一样,每个节点有一个父节点和可能的两个子节点。这种父子关系让二叉树有了一种特殊的结构。

比如,我们可以想象一棵树的根节点是家族的祖先,他的两个子节点就是祖先的两个儿子或者两个女儿。每个子节点又可以有两个子节点,就像是一代一代传承下去。这种层层递进的结构让我们可以非常方便地对数据进行存储和查找。

不过,二叉树并不只是用来存储家谱这么简单,他还可以用来处理各种问题。比如,大家在玩游戏时经常会遇到能够找到最优解的情况,这时候就可以用二叉树来进行搜索。还有在编程中,我们经常需要对数据进行排序,也可以借助二叉树的特性来实现。

对于程序员来说,掌握二叉树是非常重要的。他不仅可以提高我们的编程技能,还可以帮助我们更好地理解和解决问题。所以,如果你希望在编程领域有所建树,二叉树绝对是一个必备的工具。

首先,我们来看一棵二叉树的示例:

         A
       /   \
      B     C
     / \   / \
    D   E F   G

这棵树包含了七个节点,每个节点都有一个唯一的字母标识。现在我们要来讲解遍历这棵树的三种不同方式。

  1. 前序遍历:
    在前序遍历中,我们先访问根节点,然后递归地遍历左子树,再递归地遍历右子树。换句话说,我们先访问根节点,再访问左节点,最后访问右节点。

对于上面的示例树,前序遍历的结果是:A -> B -> D -> E -> C -> F -> G。

  1. 中序遍历:
    在中序遍历中,我们先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。换句话说,我们先访问左节点,再访问根节点,最后访问右节点。

对于上面的示例树,中序遍历的结果是:D -> B -> E -> A -> F -> C -> G。

  1. 后序遍历:
    在后序遍历中,我们先递归地遍历左子树,然后递归地遍历右子树,最后访问根节点。换句话说,我们先访问左节点,再访问右节点,最后访问根节点。

对于上面的示例树,后序遍历的结果是:D -> E -> B -> F -> G -> C -> A。

以下是通过递归的方式实现二叉树的遍历:

#include <iostream>
#include <vector>
using namespace std;
struct TreeNode
{
    int val;
    TreeNode *leftchild;
    TreeNode *rightchild;
    TreeNode(int x) : val(x) , leftchild(nullptr) ,  rightchild(nullptr) {}
};

void preorder(TreeNode* root)
{
    if (root == nullptr) return;
    cout << "TreeNode: " << root->val << " ";
    preorder(root->leftchild);
    preorder(root->rightchild);
}

void inorder(TreeNode* root)
{
    if (root == nullptr) return;
    inorder(root->leftchild);
    cout << "TreeNode: " << root->val << " ";
    inorder(root->rightchild);
}

void postorder(TreeNode* root)
{
    if (root == nullptr) return;
    postorder(root->leftchild);  
    postorder(root->rightchild);
    cout << "TreeNode: " << root->val << " ";
}


int main()
{
    TreeNode* root = new  TreeNode(6);
    root->leftchild = new  TreeNode(3);
    root->rightchild = new  TreeNode(4);
    root->leftchild->leftchild = new  TreeNode(2);
    root->leftchild->rightchild = new  TreeNode(8);
    root->rightchild->leftchild = new  TreeNode(5);

    cout << "preorder" << endl;
    preorder(root);
    cout << endl;

    cout << "inorder" << endl;
    inorder(root);
    cout << endl;

    cout << "postorder" << endl;
    postorder(root);
    cout << endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值