距离上一篇二叉树的创建已经过去好几天了,小弟也是刚刚开始写博客,没有组织好语言(我说我忘了,你信么)。。
上一篇文章已经说了怎么创建一棵二叉树了, 当然我们创建出来不是仅仅为了实现或者好玩的,我们是要用来操作数据的。
那么我们要怎么把我们的数据插入到一棵二叉树中呢??
确实,这是比较麻烦的事。。每棵子树又有两棵子树,那么我们怎么找到我们需要的位置呢? 殊不知这正是二叉树简单的地方。我们的节点至多只有两棵子树,如果不是二叉树确实就是很麻烦的事了。不知到大家又没学过哈夫曼树?有没有一点灵感了,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;
}