求二叉树的算法

原创 2007年09月25日 21:44:00
 

1、题:

有如下表,记录了分左右区的2叉树记录。其中:LorR字段,-1 表示顶级,1 表示左边,2表示右边;Parent_id子段,-1 表示顶级,其它表示上级父ID;User_id字段值是唯一的。

User_idParent_idLorR

1-1-1

211

312

421

522

631

......

请书写一个存储过程,返回给定User_id 的左、右区中小区(网络点数少一点的区,一样多则左边优先)的最下一个新节点(如有左右2个空节点,左边优先)。

 

格式:

P_GetNewNode (@User_id int, @Node_id int output, @LorR int output)

AS

......

set @Node_id = ...

set @LorR = ...

GO

 

 

create table BTree(UserID int, ParentID int, LorR int)

go—为了便于测试,我多写了几行

insert BTree select 1, -1, -1

union all select 2, 1, 1

union all select 3, 1, 2

union all select 4, 2, 1

union all select 5, 2, 2

union all select 6, 3, 1

union all select 7, 4, 1

union all select 8, 6, 1

union all select 9, 6, 2

union all select 10, 7, 1

union all select 11, 8, 1

union all select 12, 8, 2

union all select 13, 9, 2

union all select 14, 10, 2

Go

 

create function fnGetSubNodes(@UserID int)—得到子节点个数

returns int as

begin

declare @Total int, @SubNodeL int, @SubNodeR int

set @Total=0

select @SubNodeL=UserID from BTree where ParentID=@UserID and LorR=1

select @SubNodeR=UserID from BTree where ParentID=@UserID and LorR=2

if @SubNodeL is not null

set @Total=1+dbo.fnGetSubNodes(@SubNodeL)

if @SubNodeR is not null

set @Total=@Total+1+dbo.fnGetSubNodes(@SubNodeR)

return @Total

end

go

 

 

--得到最深的节点层数,通过递归去找最深的值,如果左右都有子节点,再判断谁的子节点层次深,总之每次在递归返回都是最深的节点值(写这段我也差点被搅晕了,后来才在每上IF上加了注释,为了便于以后阅读,又加了些)

create function fnGetSubLayers(@UserID int, @Layer int)

returns varchar(100) as

begin

declare @result varchar(100)

set @result=cast(@Layer as varchar)+'|'+cast(@UserID as varchar)

declare @NID int, @NID2 int, @LL varchar(10), @LR varchar(10)

select @NID=UserID from BTree where ParentID=@UserID and LorR=1

select @NID2=UserID from BTree where ParentID=@UserID and LorR=2

if @NID is not null

begin

set @LL=dbo.fnGetSubLayers(@NID,@Layer+1)

if @NID2 is not null

begin

set @LR=dbo.fnGetSubLayers(@NID2,@Layer+1)

if(convert(int,left(@LL,charindex('|',@LL)-1))>=convert(int,left(@LR,charindex('|',@LR)-1)))—在两个都不为空的情况下再判断哪个层深@result就等于哪个返回值

set @result=@LL

else

set @result=@LR

end

else—当右边为空时,@result等于左边返回值

set @result=@LL

end

else if@NID2 is not null—如果左为空,而右不为空,调用并返回右边值

begin

set @LR=dbo.fnGetSubLayers(@NID2,@Layer+1)

set @result=@LR

end

return @result

end

go

 

create procedure spGetNewNode(@UserID int, @NodeID int output, @LorR int output)

AS

BEGIN

declare @SubNodeL int, @SubNodeR int, @Layer varchar(100)

select @Layer='0|'+cast(@UserID as varchar)

select @SubNodeL=UserID from BTree where ParentID=@UserID and LorR=1

select @SubNodeR=UserID from BTree where ParentID=@UserID and LorR=2

if @SubNodeL is not null

if @SubNodeR is not null

if(dbo.fnGetSubNodes(@SubNodeL)<=dbo.fnGetSubNodes(@SubNodeR))

set @Layer=dbo.fnGetSubLayers(@SubNodeL,0)

else

set @Layer=dbo.fnGetSubLayers(@SubNodeR,0)

else—如果右边为空,调用左边和上面的类似

set @Layer=dbo.fnGetSubLayers(@SubNodeL,0)

else if @SubNodeR is not null

set @Layer=dbo.fnGetSubLayers(@SubNodeR,0)

select @NodeID=convert(int,right(@Layer,len(@Layer)-charindex('|',@Layer)))

select @LorR=LorR from BTree where UserID=@NodeID

END

GO

 

--可以显示一下

declare @UserID int, @NodeID int, @LorR int

set @UserID=1

print('UserIDNodeIDLorR')

while @UserID<=14

begin

exec dbo.spGetNewNode @UserID, @NodeID output, @LorR output

print(cast(@UserID as varchar)+''+cast(@NodeID as varchar)+''+cast(@LorR as varchar))

set @UserID=@UserID+1

end

 

go

 

--到最后你也可以删掉所用的东东

drop function dbo.fnGetSubLayers

drop function dbo.fnGetSubNodes

drop procedure dbo.spGetNewNode

drop table BTree

作者简介:

陈茂华,男,四川达州人,主要研究方向:办公自动化信息系统,GIS系统

Email:cmh-163@163.com

相关文章推荐

C++算法之 求二叉树的节点个数、深度、四种遍历方法

//节点的数据结构 class BTree { public: int m_nValue; BTree* m_nLeft; BTree* m_nRight; ...

【算法导论】求二叉树的叶子数和深度

二叉树的叶子数和深度 二叉树的遍历算法是许多二叉树运算的算法设计的基础,因此遍历算法的应用很广泛。下面以遍历算法求二叉树的叶子数和深度为例,来加深对于二叉树遍历算法的理解。 1. 统计二叉树中的叶子结...

【算法编程】求二叉树的深度-Maximu Depth of Binary Tree

题目大意:很简单,只需要找出一颗二叉树的最大深度即可,貌似没有时间和空间的要求。求解方法:更简单,只需要按照宽度优先的方法去查找即可,在这里我用a队列保存待扩展的节点,用b来保存a扩展出来的节点,再利...

算法基础(九):超详细最优二叉树构建(2)求编码

算法基础(八):超详细最优二叉树构建(2)求编码

设计一个算法,求非空二叉树b的宽度(即具有节点最多的那一层的节点个数)

思想:假设二叉树采用二叉链存储结构,采用层次遍历的方法求出所有节点的层次,并将所有节点和对应的层次放在一个队列中。然后通过扫描队列求出各层的节点总数,最大的层节点总数即为二叉树的宽度。对应的算法如下:...

有关完全二叉树求节点数和前缀树求字符串是否重复的两道算法题

有关求完全二叉树的节点数和用前缀树求字符串是否重复的两道算法题总结

面试常考算法题 局部最小 求二叉树结点 求两个数组中所有数的上中位数 两个数组的所有数中第K小的数

定义局部最小的概念。arr长度为1时,arr[0]是局部最小。arr的长度为N(N>1)时,如果arr[0] 给定无序数组arr,已知arr中任意两个相邻的数都不相等,写一个函数,只需返回arr中任...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求二叉树的算法
举报原因:
原因补充:

(最多只允许输入30个字)