二叉树
最近在准备面试,在收集面经的过程中我发现二叉树是面试过程中非常容易被考到的一种数据结构。于是我抓紧复习了一下之前所学的,基本都忘差不多了。下面这篇文章介绍一下二叉树的常见几种创建。(随便和大家说一下图和树的区别,树当中不能有环路,而图可以有环路)
二叉树的创建
前序
首先先给大家补充几个知识吧
1.什么是二叉树:二叉树顾名思义就是每个节点最多有俩个分支的树。(没错定义就是这么简单)
2.前序遍历:就是从首节点出发一直向下遍历,遍历到了节点就打印,直到左节点空了,再遍历右节点(中左右)
2.中序遍历:还是一直向左遍历,直到左边为空了才打印(区别),然后返回父节点再打印,再遍历右节点打印(左中右)
3.后续遍历:还是一直向左遍历,直到左边为空,再返回父节点,再遍历右节点,直到左右节点都为空才打印(区别)(左右中)
那么二叉树的创建方法有很多,比如前序创建,哈夫曼树的创建,给定前序和中序…有很多创建方法,这里就先介绍前序创建,如果后面有时间再把其他几种加上
1.创建二叉树之前得先定义一个结构体,没有叶子哪有树对吧,那么二叉树肯定有他的左孩子,还有一个右孩子,还有他自己储存的内容三部分构成。
struct node
{
char content;
node* lchild;
node* rchild;
};
2.创建好叶子之后,就是想办法让这些叶子连起来组成一棵树了,首先我们想一下如果这棵树只有一个节点的话,就直接把值赋进去,然后把左右节点设为空就行了。如果是俩个节点就是再建立一个节点,然后让父节点的lchild指向他就行了,如果再又就再插,所以很明显这是递归的思想。下面给出递归函数
void createBiTree(node* &fnode)//按#结束,其他键为输入
{
char a;
cin >> a;
if (a == '#')
return;
fnode = new node;
fnode->content = a;
fnode->lchild = nullptr;
fnode->rchild = nullptr;
createBiTree(fnode->lchild);
createBiTree(fnode->rchild);
}
注意传的是指针的引用,或者穿二维指针也可以,这里容易错,这样前序创建也就完成了。
二叉树的遍历
遍历也是有三种方法,就是刚才补充的内容,前序,后序,和中序,想必过程大家都知道了,但是代码该怎么实习呢?建议大家先用递归自己试试,下面给出递归函数
void visit(node* fnode)
{
if (fnode == nullptr)
return;
cout << fnode->content;
visit(fnode->lchild);
visit(fnode->rchild);
}
这就是前序遍历了,同样也是递归,大家可以减少节点的数目先假设有三个节点,去想这个过程,然后慢慢加节点,相信大家肯定能写出后序和中序了
中序
void visit(node* fnode)
{
if (fnode == nullptr)
return;
visit(fnode->lchild);
cout << fnode->content;
visit(fnode->rchild);
}
后序
void visit(node* fnode)
{
if (fnode == nullptr)
return;
visit(fnode->lchild);
visit(fnode->rchild);
cout << fnode->content;
}
其实创建和遍历都不难,但是对于初学者而言,还是难在递归,所以有空的话还是要多练练递归,然后慢慢理解这个过程。
希望对大家有帮助哦