上周有粉丝留言
说想复习下二叉树
这叫什么
这叫“温故而知新,可以为师矣”
那作为风流倜傥、玉树临风
爱与天使的化身
腹肌与才华集于一身的男人
必须给安排一波
有问题吗?
没有问题
谁让咱人帅心善!
呐
你说有必要一开始就整一些
高深莫测的吗
诶没有必要
为什么呢?
你说一个人忘了好久的知识点
想要复习复习
结果你净整一些小学奥数、大学物理
且不说他现在还能不能记起来
关键是
我也不会呀!
综合考虑之下
我觉得出个大型科普情感综艺烧脑解密类
连续剧
用于解释下二叉树
今天就是第一期
建树!
前言:
二叉树的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);
}
树结构和预期一致。
下期探究树的其他操作
欢迎关注我的个人公众号【头发头发等等我】