zoukankan      html  css  js  c++  java
  • 二叉树输入与存储的问题

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

  • 相关阅读:
    20150603_Andriod 多个窗体数据回调
    onActivityResult传值的使用
    20150602_Andriod 向窗体传递参数
    20150601_Andriod 打开新窗体
    C# 添加.DLL 出错的解决方法
    c# 中crystal report输出PDF文件
    参考_Android中,如何新建一个界面,并且实现从当前界面切换到到刚才新建的(另外一个)界面
    andriod 新建 Activity_ Form (详细设置)
    sql in
    如何取得GridView被隐藏列的值
  • 原文地址:https://www.cnblogs.com/cnsec/p/11830684.html
Copyright © 2011-2022 走看看