经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C 语言 » 查看文章
将一个数组中的各节点按照层次遍历插入构成完全二叉树
来源:cnblogs  作者:OrdinaryMan  时间:2018/11/28 9:52:34  对本文有异议

按层次构建完全二叉树

(本人入门水平,这是我的第一篇博客,希望通过写写博客能增强自己的理解,同时也能给大家提供一些力所能及的帮助,通过这个平台共同进步,有错误的地方希望各位大佬指出来,我会努力改正的,谢谢大家!)

1.主要思想:

        由于是层次遍历,必须保证一行(也就是一层)构建完成才能继续添加下一层的节点,这就使对于树的来讲,操作比较方便的“递归算法”会在这个问题上操作困难。

为了达到按照层次遍历的需求,我们需要另外寻求方法,那就是用迭代(也就是循环)。

       从根节点开始循环,每次创建两个结点,分别作父亲节点的左孩子和右孩子,通过(层数-1)(log2[节点数]来确定)来控制循环次数,并通过条件判断来防止超出节点个数。

2.代码部分:

  1. 1 typedef int Elementtype; // 定义数据类型,可根据需要自行定制
  2. 2 typedef struct TreeNode * Node; // Node相当于struct treeNode *
  3. 3 // 定义数节点结构
  4. 4 typedef struct TreeNode {
  5. 5 Elementtype value;
  6. 6 Node left; // 树节点的左子节点
  7. 7 Node right; // 树节点的右子节点
  8. 8 }TREE,*PTREE;
  9. 9
  10. 10
  11. 11 //初始化
  12. 12 void initBtree(PTREE &bTree){
  13. 13 bTree= new TREE;
  14. 14 bTree->left=NULL;
  15. 15 bTree->right=NULL;
  16. 16 bTree->value=0;
  17. 17 }
  18. 18
  19. 19
  20. 20
  21. 21 // 层次遍历构造完全二叉树定义
  22. 22 void bTreetobTree(PTREE bTree1,int *val,int length) {//数组和数组的长度
  23. 23 PTREE p = bTree1;
  24. 24 PTREE q = bTree1;
  25. 25 for(int i=length;i>=0;i--){
  26. 26 val[i+1]=val[i];
  27. 27 }
  28. 28 length++;
  29. 29 val[0]=0;
  30. 30 int m=log2(length);
  31. 31 int max= pow(2,m)-1;
  32. 32 for(int i=0;i<max;i++){
  33. 33 p->value = val[i];
  34. 34 if(length>2*i+1){
  35. 35 PTREE pArr2 = (PTREE)malloc(sizeof(TREE));
  36. 36 p->left = pArr2;
  37. 37 p->left->value = val[2*i+1];
  38. 38 p->left->left=NULL;
  39. 39 p->left->right=NULL;
  40. 40 }
  41. 41 if(length>2*i+2){
  42. 42 PTREE pArr3 = (PTREE)malloc(sizeof(TREE));
  43. 43 p->right = pArr3;
  44. 44 p->right->value = val[2*i+2];
  45. 45 p->right->left=NULL;
  46. 46 p->right->right=NULL;
  47. 47 }
  48. 48 if(i%2==0){
  49. 49 q=p;
  50. 50 p=p->left;
  51. 51 }
  52. 52 else{
  53. 53 p=q->right;
  54. 54 }
  55. 55 }
  56. 56 printf("\n*************************************************************************************\n");
  57. 57 printf("\n最终得到的完全二叉树经过中序输出为:\n");
  58. 58 InOrderTree(bTree1);
  59. 59 }

主函数就不写了。

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号