二叉树输入与存储的问题
这几天在写数据结构中的二叉树遍历时,发现最困扰的问题是递归与非递归,dfs,bfs的实现需要建立在完整的二叉树结构上。
看了几篇博客后,我把自己对于二叉树建立时的注意事项与大家分享下:
二叉树的建立主要有数组与链表两种形式,如果建立的是完全二叉树,本人推荐使用数组,用下标进行容易理解,出错率低。今天我主要介绍的是使用链表存储二叉树。
在使用链表存储时一定要给子节点打上标记,你可以使用输入0时到达子节点,也可以使用输入#时到达子节点,取决于你输入的数据是int还是char,使用链表存储时是使用递归前序法建树,优点是代码量少,容易理解。
下面直接上代码:
定义树的基本结构
typedef struct node
{
char str;
node* lc;
node* rc;
}tree;
tree* root;
递归法建立二叉树
tree* InPut()
{
char c;
tree *root;
scanf("%c",&c);
if (c!='#') {
root=(tree*)malloc(sizeof(tree));
root->str=c;
root->lc=InPut();
root->rc=InPut();
}
else root=NULL;
return root;
}
这里因为我后面的操作是对字符操作所以我选择了#最后结束标志
那么什么时候输入#呢:
遇到子节点输入节点字符之后需要连续输入两个#因为他的左右节点都是空的所以需要输入两个,如果该节点右子树为空则在输入该节点字符后输入一个#,原因同上。
接下来我使用的是bfs遍历二叉树,网上dfs代码很多而且很简单就不多赘述,我分享bfs代码给大家
void bfs(tree* a)
{
queue<tree*> q_tree;
if (a!=NULL) {
q_tree.push(a);
}
else return;
while (!q_tree.empty()) {
tree* node=q_tree.front();
printf("%3c",node->str);
if (node->lc!=NULL) {
q_tree.push(node->lc);
}
if (node->rc!=NULL) {
q_tree.push(node->rc);
}
q_tree.pop();
}
}
主函数
int main()
{
root=InPut();
bfs(root);
}
下面我先讲解一下这里的BFS遍历,BFS就是广度优先搜索,与DFS深度优先搜索齐名,DFS主要是采用递归的方法由第一层遍历到最后一层再回溯,而BFS是利用队列这个数据结构将要访问的节点暂时保存下来,达到一行一行访问的效果。因为采取的是先根节点再左节点,右节点的顺序输出,所以在入队列的时候先入队左子树再入队右子树。
网络上志同道合,我们一起学习网络安全,一起进步,QQ群:694839022