用户二叉树排序需求
用户注册,输入以下注册信息:
- 电子邮箱- 密码- 确认密码- 推荐人id(此id可以在数据库中手动增加一个)
每注册进一个新用户,该用户就进入到排序中
排序规则
新增用户必须在推荐人下面按照从左到右,从上到下的方式遍历,找到空位插入数据下列是图解:
假设a是根节点(a就是手动添加的第一位用户)
有一个新用户注册进来(假设新用户为b),推荐人id填写的是a的id,则排序如下:
a / b
又有一位c用户注册,推荐人id填写的是b的id,则:
a / b / c
有一位d用户注册,推荐人id填写的是a的id,则:
a / \ b d /
c
有一位e用户注册,推荐人id填写的是b的id,则
a / \ b d / \ c e
有一位f用户注册,推荐人id填写的是a的id,则
a / \ b d / \ / c e f
有一位g用户注册,推荐人id填写的是e的id,则
a / \ b d / \ / c e f / g
有一位h用户注册,推荐人id填写的是b的id,则
h的推荐人是b,所以,h必定是在b的下面,然后按照从左到右的方式查找,c和e占了上面的两个位置,所以到下一排查找,找到空位,则插入h,以下都是这种规律
a / \ b d / \ / c e f / /h g
有一位i用户,和j用户又陆续注册进来,填写的都是c的id,则
a / \ b d / \ / c e f / \ / h i g /j
有一位k用户,和l用户又陆续注册进来,填写的都是a的id,则
a / \ b d / \ / \ c e f k/ \ / \ h i g l /j
有一位m用户,n用户和o用户 又注册进来,填写的分别是b用户,c用户,和l用户的id,则:
a / \ b d / \ / \ c e f k / \ / \ h i g l / \ j m
a / \ b d / \ / \ c e f k / \ / \ h i g l / \ / j m n
a / \ b d / \ / \ c e f k / \ / \ h i g l / \ / /j m n o
有一位p用户、q用户、r用户、s用户又注册进来,填写的分别是a用户,b用户,e用户,a用户的id。则:
a / \ b d / \ / \ c e f k / \ / \ / h i g l p / \ / / j m n o
a / \ b d / \ / \ c e f k / \ / \ / h i g l p / \ / \ / j m n q o
a / \ b d / \ / \ c e f k / \ / \ / h i g l p / \ / \ / / j m n q r o
a / \ b d / \ / \ c e f k / \ / \ / \ h i g l p s / \ / \ / / j m n q r o
回复内容: 用户二叉树排序需求
用户注册,输入以下注册信息:
- 电子邮箱- 密码- 确认密码- 推荐人id(此id可以在数据库中手动增加一个)
每注册进一个新用户,该用户就进入到排序中
排序规则
新增用户必须在推荐人下面按照从左到右,从上到下的方式遍历,找到空位插入数据下列是图解:
假设a是根节点(a就是手动添加的第一位用户)
有一个新用户注册进来(假设新用户为b),推荐人id填写的是a的id,则排序如下:
a / b
又有一位c用户注册,推荐人id填写的是b的id,则:
a / b / c
有一位d用户注册,推荐人id填写的是a的id,则:
a / \ b d /
c
有一位e用户注册,推荐人id填写的是b的id,则
a / \ b d / \ c e
有一位f用户注册,推荐人id填写的是a的id,则
a / \ b d / \ / c e f
有一位g用户注册,推荐人id填写的是e的id,则
a / \ b d / \ / c e f / g
有一位h用户注册,推荐人id填写的是b的id,则
h的推荐人是b,所以,h必定是在b的下面,然后按照从左到右的方式查找,c和e占了上面的两个位置,所以到下一排查找,找到空位,则插入h,以下都是这种规律
a / \ b d / \ / c e f / /h g
有一位i用户,和j用户又陆续注册进来,填写的都是c的id,则
a / \ b d / \ / c e f / \ / h i g /j
有一位k用户,和l用户又陆续注册进来,填写的都是a的id,则
a / \ b d / \ / \ c e f k/ \ / \ h i g l /j
有一位m用户,n用户和o用户 又注册进来,填写的分别是b用户,c用户,和l用户的id,则:
a / \ b d / \ / \ c e f k / \ / \ h i g l / \ j m
a / \ b d / \ / \ c e f k / \ / \ h i g l / \ / j m n
a / \ b d / \ / \ c e f k / \ / \ h i g l / \ / /j m n o
有一位p用户、q用户、r用户、s用户又注册进来,填写的分别是a用户,b用户,e用户,a用户的id。则:
a / \ b d / \ / \ c e f k / \ / \ / h i g l p / \ / / j m n o
a / \ b d / \ / \ c e f k / \ / \ / h i g l p / \ / \ / j m n q o
a / \ b d / \ / \ c e f k / \ / \ / h i g l p / \ / \ / / j m n q r o
a / \ b d / \ / \ c e f k / \ / \ / \ h i g l p s / \ / \ / / j m n q r o
不谈为何要实现这样一个奇怪的需求。
就简单实现这个功能来讲,可以根据数据结构中二叉树的顺序存储方式来解决吧。
这里就用php中的数组来模拟二叉树的顺序存储,数组中的key相当于存储地址,value相当于存储的数据。当然key为有类似下面这样的结构:
0 / \ 1 2
也就是父节点key值记为n,则左子节点key为2n+1,右子节点key为2(n+1)。下面简单用php代码实现下吧(由家里本本没有php运行环境,没测试代码的完全正确性@#@):
phpclass tree { private $data = []; public function __construct() {} /** * @param mixed $val * @param int $pid 父节点在$data中的key值 * @return int 返回插入节点的对应在$data中的key值 */ public function add($val, $pid = 0) { // 若为空树则插入根节点 if (!count($this->data)) { $this->data[0] = $val; return 0; } // 若左子节点为空则插入左子节点 if (!isset($this->data[2*$pid+1])) { $this->data[2*$pid+1] = $val; return 2*$pid+1; } // 若右子节点为空则插入右子节点 if (!isset($this->data[2*$pid+2])) { $this->data[2*pid+2] = val; return 2*pid+2; } // 获取$data中最后一个节点的key值 $maxkey = max(array_keys($this->data); // 如果是完全二叉树的情况(也就是$data中没有空节点)则在$data最后插入值 if (count($this->data) === $maxkey + 1) { $this->data[$maxkey+1] = $val; return $maxkey + 1; } // 不为完全二叉树则在$data中最小的空key处插入值 for ($i = 0; $i data[$i])) { $this->data[$i] = $val; return $i; } } }}// 简单测试$tree = new tree();$aid = $tree->add('a', 0);$bid = $tree->add('b', $aid);$tree->add('c', $bid);
你好,你这个需求会了吗?现在我也遇到这个需求,无法实现啊···求帮助,qq369832727