第章 嵌入式linux内核常见数据结构.ppt

  1. 1、本文档共63页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第章 嵌入式linux内核常见数据结构

软件学院嵌入式系 * * 之所以称为红黑树的原因就在于它的每个节点都被着色为红色或黑色。这些节点颜色被用来检测树的平衡性。但需要注意的是,红黑树并不是严格意义上的平衡二叉树,恰恰相反,红黑树放松了平衡二叉树的某些要求,由于一定限度的不平衡,红黑树的性能得到了提升。 从根节点到叶节点的黑色节点数被称为树的黑色高度(black-height)。前面关于红黑树的性质保证了从根节点到叶节点的路径长度不会超过任何其他路径的两倍。因此,对于给定的黑色高度为n的红黑树,从根到叶节点的简单路径的最短长度为n?1,最大长度为2×(n?1)。 红黑树在插入和删除操作中,节点可能需要被旋转以保持树的平衡。红黑树的平均和最差搜索时间都是O(log2N)。在实际应用中,红黑树的统计性能要好于严格平衡二叉树(如AVL树),但极端性能略差。 * * 从代码中,可知该哈希函数是基于表索引乘以一个适当的大数,于是结果溢出,就用32位变量中的值进行模数运算(使用移位操作来实现)。据有位专家分析,如果想得到满意的结果,这个大乘数应该是一个接近黄金比例的232数量级的素数。0x9e370001就是接近的素数,这个数可以通过加法运算和移位运算得到,0x9e370001 = 231 + 229 – 225 + 222 – 219 – 216 + 1 软件学院嵌入式系 4.2.2 二叉树 4)二叉树的常见操作 (1)遍历二叉树 所谓遍历二叉树就是按某种顺序访问二叉树中的每个节点一次且仅一次的过程。这里的访问可以是输出、比较、更新、查看元素内容等操作。 二叉树的遍历方式分为两大类: 一类按根、左子树和右子树3个部分进行访问; 另一类按层次访问。 TLR(根左右) LTR(左根右) LRT(左右根) 软件学院嵌入式系 4.2.2 二叉树 ① 先序遍历的流程: 若二叉树为空,则结束遍历操作; 访问根节点; 先序遍历左子树; 先序遍历右子树。 int pre_order_traverse(tree_node *node) { if (!node) { return 1; } /* 访问根节点 */ printf(%c , node-data); /* 先序遍历左子树 */ pre_order_traverse(node-lchild); /*先序遍历右子树*/ pre_order_traverse(node-rchild); return 0; } 先序序列:e a c b d f h g 软件学院嵌入式系 4.2.2 二叉树 ②中序遍历的流程: 若二叉树为空,则结束遍历操作; 中序遍历左子树; 访问根节点; 中序遍历右子树。 int in_order_traverse(tree_node * node) { if (!tree_node) { return 1; } /* 中序遍历左子树 */ in_order_traverse(node-lchild)); /* 访问根节点 */ printf(%c , node-data)); /* 中序遍历右子树 */ in_order_traverse(node-rchild)) return 0; } 中序序列:a b c d e f g h 软件学院嵌入式系 4.2.2 二叉树 ③ 后序遍历的流程: 若二叉树为空,则结束遍历操作; 后序遍历左子树; 后序遍历右子树; 访问根节点。 Int post_order_traverse(tree_node * node) { if (!node) { return 1; } /* 后序遍历右子树 */ post_order_traverse(node-rchild)); /* 后序遍历左子树 */ post_order_traverse(node-lchild)); /* 访问根节点 */ printf(%c , node-data)); return 0; } 后序序列:b d c a g h f e 软件学院嵌入式系 4.2.2 二叉树 4)二叉树的常见操作 (2)统计二叉树中的叶子节点 这个操作可以使用3种遍历顺序中的任何一种,只是需要将访问操作变成判断该结点是否为叶子节点,如果是叶子节点将累加器加1即可。 软件学院嵌入式系 统计二叉树中的叶子节点 /*二叉树叶子节点统计*/ int leaf_num(tree_node *node, int *count) { if (!node){return 1; } else { /* 访问根节点,判断该节点是否为叶子节点 */ if (!node-lchi

文档评论(0)

docman126 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档