数据结构之二叉树(构建及前序、中序、后序、层次遍历)

二叉树(Binary
tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分

二叉树是n个有限元素的集合,该集合或者为空、或者由一个称为根(root)的元素及两个不相交的、被分别称为左子树和右子树的二叉树组成,是有序树。当集合为空时,称该二叉树为空二叉树。在二叉树中,一个元素也称作一个结点

树的学习比较依赖递归思想,如果对于递归不是十分了解,建议先掌握递归算法;简单二叉树相关实现如下:

节点定义:

struct Node
{
    Node *left;		//左子树
    Node *right;	//右子树
    int data;		//数据域
};

初始化:

void initRoot(Node **root, int data)
{
    if(!*root)
    {
        *root  = new Node;
        (*root)->left = nullptr;
        (*root)->right = nullptr;
        (*root)->data = data;
    }
}

前根序遍历:

void preorderTraversal(Node *root)
{
    if(root)
    {
        cout << root->data << " ";
        preorderTraversal(root->left);
        preorderTraversal(root->right);
    }
}

中根序遍历:

void inorderTraversal(Node *root)
{
    if(root)
    {
        inorderTraversal(root->left);
        cout << root->data << " ";
        inorderTraversal(root->right);
    }
}

后根序遍历:

void postorderTraversal(Node *root)
{
    if(root)
    {
        postorderTraversal(root->left);
        postorderTraversal(root->right);
        cout << root->data << " ";
    }
}

层次遍历:

void levelTraversal(Node *root, int level)
{
    if(!root)
    {
        return;
    }

    if(level == 1)
    {
        cout << root->data << " ";
    }
    else if(level > 1)
    {
        levelTraversal(root->left, level - 1);
        levelTraversal(root->right, level - 1);
    }
}

插入节点:

bool insert(Node *&root, int data)
{
    if (!root)
    {
        root = new Node;
        root->data = data;
        root->left = nullptr;
        root->right = nullptr;
        return true;
    }
    if(data > root->data)
    {
        insert(root->right, data);
    }
    else if(data < root->data)
    {
        insert(root->left, data);
    }
    else if(data == root->data)
    {
        //不允许重复
        return false;
    }
    return true;
}

相关链接:
单链表
循环链表
栈与队列

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为啥不吃肉捏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值