C#二叉树的插入操作

距离上一篇二叉树的创建已经过去好几天了,小弟也是刚刚开始写博客,没有组织好语言(我说我忘了,你信么)。。

上一篇文章已经说了怎么创建一棵二叉树了,  当然我们创建出来不是仅仅为了实现或者好玩的,我们是要用来操作数据的。

那么我们要怎么把我们的数据插入到一棵二叉树中呢??

确实,这是比较麻烦的事。。每棵子树又有两棵子树,那么我们怎么找到我们需要的位置呢? 殊不知这正是二叉树简单的地方。我们的节点至多只有两棵子树,如果不是二叉树确实就是很麻烦的事了。不知到大家又没学过哈夫曼树?有没有一点灵感了,01010101程序员的一生,所以在表示的时候我们可以使用01表示一个节点的左子树和右子树


那么,我们要找到E这个节点应该怎么表示呢???        没错 就是" 10 "

可能上面说的大家还不是很清楚,这样举个例子是不是 就很清楚许多了??

好了,接下来就该说说代码怎么设计了。我们肯定是应该传一个表示位置的参数进去的,比如上面说的E节点 “10”,大家可能认为确实是这样,但是这样是有问题的,有没有想过如果是B节点呢???! 传“0”进去吗?  D节点我们又应该传什么进去呢?   还是“0”吗??我们要怎么知道我们要找的是B还是D呢?

所以,这里我们不能直接这样传数进去。那么。我们应该怎么办呢?

对的, 我们为什么不直接传01010101进去呢?  确实是这样,我们可以传进制数进去呢??0x11。。。。。。然后我们按位取出来不就行了嘛,是的, 确实是这样, 但又有一个问题,我们传0001进去,我们如何知道我们只需要01呢??系统是不知道我们只需要两位的, 所以我们又需要传一个count进去了。。如果count = 2, 我们是不是就找到E节点了呢(我们从低位开始取,所以0001, count= 2, 结果应该是10.需要理解一下)

废话不多说,直接上代码,我相信大家应该是看得懂了(flag表示我们需要插入到此节点的右边还是左边):

public Boolean Insert(Btree t, TreeNode node, uint pos, int count, int flag)
        {
            Btree tt = t;
            Boolean ret = (tt != null) && (node != null) && (flag == 0) || (flag == 1);
            uint bit = 0;


            if (ret)
            {
                TreeNode parent = null;
                TreeNode current = tt.node;


                while ((count > 0) && (current != null))
                {
                    //查找我们要插入的位置
                    bit = pos & 1;
                    pos = pos >> 1;


                    parent = current;


                    if (bit == 0)
                    {
                        current = current.lchild;
                    }
                    else if (bit == 1)
                    {
                        current = current.rchild;
                    }


                    count--;
                }


                //执行插入
                if (flag == 0)
                {
                    node.lchild = current;
                }
                else if (flag == 1)
                {
                    node.rchild = current;
                }

                //这里将原来节点的子树赋值到我们新节点的子树
                if (parent != null)
                {
                    if (bit == 0)
                    {
                        parent.lchild = node;
                    }
                    else if (bit == 1)
                    {
                        parent.rchild = node;
                    }
                }
                    //若树没有节点 则设置为根节点
                else 
                {
                    tt.node = node;
                }
                //节点数加一
                tt.num++;
            }
            return ret;
        }


猜你喜欢

转载自blog.csdn.net/qq_24391357/article/details/80267975