小白都能看懂的二叉树基本操作(一):建树

上周有粉丝留言

说想复习下二叉树

这叫什么

这叫“温故而知新,可以为师矣”

那作为风流倜傥、玉树临风

爱与天使的化身

腹肌与才华集于一身的男人

必须给安排一波

有问题吗?

没有问题

谁让咱人帅心善!

你说有必要一开始就整一些

高深莫测的吗

诶没有必要

为什么呢?

你说一个人忘了好久的知识点

想要复习复习

结果你净整一些小学奥数、大学物理

且不说他现在还能不能记起来

关键是

我也不会呀!

图片

综合考虑之下

我觉得出个大型科普情感综艺烧脑解密类

连续剧

用于解释下二叉树

今天就是第一期

建树!


前言:

       二叉树的Node节点结构如下:

图片

       同时,为了尽可能的简化,我们将传递一个字符串用于构建二叉树。我们规定以 '#' 字符作为NULL的代表,即字符串中NULL的表示为 '#',用于标记树的叶子节点。

正文:

       建树采用递归的方式,递归时先递归左子树,后递归右子树。当传递的字符串为"abc##de##f##g#h##"

       那么其表示的树结构如下:

图片

    

实现:

       思路明确,那么建树的代码如下:

#include <iostream>
#include <list>
using namespace std;


struct Node 
{
    char data;
    Node *left;
    Node *right;
};


Node *Create(char **str)
{
    Node *s = NULL;
    if(str != NULL && *str != NULL && **str != '#')
    {   
        s = new Node;
        s->data = **str;
        s->left = Create(&++*str);
        s->right = Create(&++*str);
    }   
    return s;
}

int main()
{
    char *str = "abc##de##f##g#h##";
    Node *p = Create(&str);
}

验证:

       为了验证我们的树结构是否和我们预想的相同,我们编写下打印树的代码:

#include <iostream>
#include <list>
using namespace std;

struct Node
{
    char data;
    Node *left;
    Node *right;
};

Node *Create(char **str)
{
    Node *s = NULL;
    if(str != NULL && *str != NULL && **str != '#')
    {   
        s = new Node;
        s->data = **str;
        s->left = Create(&++*str);
        s->right = Create(&++*str);
    }   
    return s;
}
void ShowTreeOnce(std::list<Node *> &listTree)
{
    if(listTree.empty())
        return ;
    Node *pTree = listTree.front();
    listTree.pop_front();
    if(pTree)
    {   
        cout<<pTree->data<<" ->left: ";
        if(pTree->left)
        {
            cout<<pTree->left->data<<"\n  ->right: ";
            listTree.push_back(pTree->left);
        }
        else
            cout<<"NULL\n  ->right: ";
        if(pTree->right)
        {
            cout<<pTree->right->data<<endl;
            listTree.push_back(pTree->right);
        }
        else
            cout<<"NULL"<<endl;
    }   
    ShowTreeOnce(listTree);
    
}
void ShowTree(Node *pTree)
{
    if(pTree == NULL)
        return ;
    std::list<Node *> listTree;
    listTree.push_back(pTree);
    ShowTreeOnce(listTree);
}

int main()
{
    char *str = "abc##de##f##g#h##";
    Node *p = Create(&str);
    ShowTree(p);
}

图片

树结构和预期一致。

下期探究树的其他操作

欢迎关注我的个人公众号【头发头发等等我】

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值