二叉树输入与存储的问题

这几天在写数据结构中的二叉树遍历时,发现最困扰的问题是递归与非递归,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是利用队列这个数据结构将要访问的节点暂时保存下来,达到一行一行访问的效果。因为采取的是先根节点再左节点,右节点的顺序输出,所以在入队列的时候先入队左子树再入队右子树。

posted @ 2018-11-07 02:35  SEC.VIP_网络安全服务  阅读(145)  评论(0编辑  收藏  举报