求二叉树的算法

原创 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

求二叉树的深度代码实现

用递归的方案实现: /* 求二叉树的深度 */ int getDepthBiTree(BITREENODE* T) { int lDepth = 0, rDepth = 0; if...
  • u010889616
  • u010889616
  • 2015年10月30日 23:40
  • 2005

二叉树基本算法,递归非递归遍历以及求高度、宽度等

二叉树基本算法,遍历以及求高度、宽度等路径 转自Powered by: C++博客   Copyright © 天一程 //二叉树的相关算法,《数据结构习题与解析》7.3 //算...
  • Youyou_0826
  • Youyou_0826
  • 2017年04月20日 20:18
  • 1631

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

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

计算二叉树中最远节点距离

二叉树最远节点距离:以根节点为轴左右子树最大深度之和与以各个子树的根节点为轴左右子树的最大深度之和的较大者。思路一:解决这个问题最直接的方式就是遍历。对每个节点求深度,之后再与保存的最大深度maxde...
  • haofight
  • haofight
  • 2016年12月18日 00:14
  • 1252

求解二叉树的深度(高度)_C语言

这是在阿里面试的一道题,刚难道感觉不是很难。于是按查找最大值和最小值的方法计算二叉树的深度。结果发现这俩个根本不是一回事。即使你不断遍历左子树,找到了最小 值,但是其最小值节点依然可能会有右子树,这样...
  • u010275850
  • u010275850
  • 2015年05月24日 21:10
  • 10113

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

//节点的数据结构 class BTree { public: int m_nValue; BTree* m_nLeft; BTree* m_nRight; ...
  • djb100316878
  • djb100316878
  • 2015年01月04日 11:42
  • 16184

二叉树的镜像

面试题19:二叉树的镜像
  • yuzhongchun
  • yuzhongchun
  • 2014年09月30日 17:02
  • 10746

二叉树如何实现双亲结点及求树的高度

求二叉树的高度,可以用递归的思想去求解,也可以用非递归的思想去求解,只不过,递归的代码简单明了,但是总的来说,递归有递归的好处,非递归当然也有非递归的好处。 求树的高度的递归思想和递归建树的思想差不...
  • CLOCK_ZHONG_ZHEN
  • CLOCK_ZHONG_ZHEN
  • 2015年12月08日 23:07
  • 1300

编程算法 - 二叉树的深度 代码(C)

二叉树的深度 代码(C)本文地址: http://blog.csdn.net/caroline_wendy题目: 输入一棵二叉树的根节点, 求该树的深度.依次选择最深的左右子树, 然后递归加1.代码:...
  • u012515223
  • u012515223
  • 2014年07月04日 11:08
  • 2516

求二叉树的深度和宽度

// 求二叉树的深度和宽度.cpp : 定义控制台应用程序的入口点。 #include "stdafx.h" #include #include using namespace std; str...
  • htyurencaotang
  • htyurencaotang
  • 2013年10月07日 22:52
  • 18463
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:求二叉树的算法
举报原因:
原因补充:

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