使用二叉树算法设计一个无限分级的树表(1)

名词解释:
  二叉树
      树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,
很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。

例如:一个公司网站的结构(当然可以更复杂)
 1首页(1,28)                       父节点范围:(x,y) x=初始值(1)    y=2*节点个数
   2公司简介(2,11)              子节点范围:(x,y) x=上级节点包含的子项最后一个数+2  y=级数*子项个数+x+1
       3集团简介(3,4)
       4品牌建设(5,6)
       5组织结构(7,8)
       6成员公司(9,10) 
   7新闻动态(12,19)
       8地产新闻(13,14)
       9法律法规(15,16)
       10行业动态(17,18)
   11工程在线(20,25)
       12市广电中心(21,22)
       13中山花园项目(23,24)
   14客户服务 (26,27)


建立测试数据表:

ContractedBlock.gifExpandedBlockStart.gifCode
--建立以上结构的表
CREATE TABLE TestTree
(
   id 
INT IDENTITY PRIMARY KEY,
   node_min 
INT,          --节点最小范围
   node_max INT,          --节点最大范围
   node_lvl INT,          --所属级数
   nodename VARCHAR(50),  --节点名称
   nodeurl NVARCHAR(150-- 节点路径

)

--建立测试数据
INSERT INTO TestTree VALUES (1,28,1,0,1,'首页','http://www.msdn.com')

   
INSERT INTO TestTree VALUES (2,11,2,1,2,'公司简介','http://www.msdn.com')
        
INSERT INTO TestTree VALUES (3,4,3,2,3'集团简介','http://www.msdn.com')
        
INSERT INTO TestTree VALUES (5,6,3,2,4'品牌建设','http://www.msdn.com')
        
INSERT INTO TestTree VALUES (7,8,3,2,5'组织结构','http://www.msdn.com')
        
INSERT INTO TestTree VALUES (9,10,3,2,6,'成员公司','http://www.msdn.com')
        
   
INSERT INTO TestTree VALUES (3,12,2,1,7,'最新公告','http://www.msdn.com')
   
   
INSERT INTO TestTree VALUES (12,19,2,1,7,'新闻动态','http://www.msdn.com')
        
INSERT INTO TestTree VALUES (13,14,3,7,8'地产新闻','http://www.msdn.com')
        
INSERT INTO TestTree VALUES (15,16,3,7,9'法律法规','http://www.msdn.com')
        
INSERT INTO TestTree VALUES (17,18,3,7,10,'行业动态','http://www.msdn.com')

  
INSERT INTO TestTree VALUES (20,25,2,1,11,'工程在线','http://www.msdn.com')
       
INSERT INTO TestTree VALUES (21,22,3,12,12,'市广电中心','http://www.msdn.com')
       
INSERT INTO TestTree VALUES (23,24,3,12,13,'中山花园项目','http://www.msdn.com')
       
  
INSERT INTO TestTree VALUES (26,27,2,1,14,'客户服务','http://www.msdn.com')

查询结果:


  遍历树:

ContractedBlock.gif ExpandedBlockStart.gif Code
   --查询树包含多少个节点
    SELECT (node_max-node_min+1)/2 FROM TestTree WHERE id=1

   
--从首页节点(1,28)到成员公司节点(9,10)的路径 如:首页->公司简介->成员公司
    SELECT * FROM TestTree WHERE node_min between 1 and 9 and node_max between 10 and 28 order by node_min 
   
   
--反向  成员公司->公司简介->首页
    SELECT * FROM TestTree WHERE node_min between 1 and 9 and node_max between 10 and 28 order by node_max 
   
   
-- 得到某个节点下面的所有节点,且按照树状结构返回 
   --拿工程在线节点(20,25)为例
    SELECT * FROM TestTree WHERE node_min>20 AND node_max<25 ORDER BY node_min
    
    
--得到首页下的第2级节点  显示为:公司简介,新闻动态,工程在线,客户服务
    SELECT * FROM TestTree WHERE node_min>1 AND node_max<34 AND node_lvl=2 ORDER BY node_min 
    
          请继续看下篇.....

转载于:https://www.cnblogs.com/huangting2009/archive/2009/05/14/1456386.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供一些关于C语言实现二叉树和哈夫曼树的基本知识和代码示例。 实现二叉树的基本思路是使用结构体来定义二叉树节点,每个节点包含一个数据元素和左右子树指针。下面是一个简单的二叉树节点定义: ```c struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; }; ``` 接下来,我们可以使用递归算法实现二叉树的遍历,包括先序遍历、中序遍历和后序遍历。下面是一个示例代码,实现了先序遍历和中序遍历: ```c // 先序遍历 void preOrderTraversal(struct TreeNode* root) { if (root == NULL) { return; } printf("%d ", root->data); preOrderTraversal(root->left); preOrderTraversal(root->right); } // 中序遍历 void inOrderTraversal(struct TreeNode* root) { if (root == NULL) { return; } inOrderTraversal(root->left); printf("%d ", root->data); inOrderTraversal(root->right); } ``` 接下来是哈夫曼树的实现。哈夫曼树是一种特殊的二叉树,用于编码和压缩数据。它的构建过程使用了贪心算法,先将所有数据元素看作一个森林,然后每次选取两个权值最小的节点合并,直到最终得到一棵树。下面是一个示例代码,实现了哈夫曼树的构建过程: ```c struct HuffmanTreeNode { int weight; struct HuffmanTreeNode* left; struct HuffmanTreeNode* right; }; struct HuffmanTreeNode* createHuffmanTree(int* weight, int n) { struct HuffmanTreeNode** nodes = (struct HuffmanTreeNode**)malloc(n * sizeof(struct HuffmanTreeNode*)); for (int i = 0; i < n; i++) { struct HuffmanTreeNode* node = (struct HuffmanTreeNode*)malloc(sizeof(struct HuffmanTreeNode)); node->weight = weight[i]; node->left = NULL; node->right = NULL; nodes[i] = node; } while (n > 1) { int min1 = 0, min2 = 1; if (nodes[min1]->weight > nodes[min2]->weight) { int tmp = min1; min1 = min2; min2 = tmp; } for (int i = 2; i < n; i++) { if (nodes[i]->weight < nodes[min1]->weight) { min2 = min1; min1 = i; } else if (nodes[i]->weight < nodes[min2]->weight) { min2 = i; } } struct HuffmanTreeNode* parent = (struct HuffmanTreeNode*)malloc(sizeof(struct HuffmanTreeNode)); parent->weight = nodes[min1]->weight + nodes[min2]->weight; parent->left = nodes[min1]; parent->right = nodes[min2]; if (min1 < min2) { nodes[min1] = parent; nodes[min2] = nodes[n - 1]; } else { nodes[min2] = parent; nodes[min1] = nodes[n - 1]; } n--; } return nodes[0]; } ``` 以上是关于C语言实现二叉树和哈夫曼树的基本知识和代码示例,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值