明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1556|回复: 6

[源码] 二叉树的autolisp实现,算法

[复制链接]
发表于 2022-10-28 10:33:20 | 显示全部楼层 |阅读模式
本帖最后由 freedom_ice 于 2022-10-28 10:39 编辑

学习数据结构,找不到autolisp版本的,摸索到common lisp,结合C语言的数据结构,实现了满二叉树及遍历。
但是目前没想到有什么应用场景。
抛砖引玉,供大家交流讨论。
知乎用户 SSSS 岩土设计


  1. ( defun c:xx()
  2.   ( setq aaa '( 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 ) )           ;;满二叉树
  3.   ( setq bbb '( 2 13 55 46 37 8 19 10 15 12 113 14 22 23 25 ) )  ;;满二叉树
  4.   ( setq bbb '( 2 13 55 46 37 8 19 10 15 12 113 14  ) )          ;;不是满二叉树
  5.   ;( setq aaa '( 0 1 2 3 4 5 6 ) )
  6.   ( setq abc ( BinaryTree 0 aaa ) )
  7.   ( princ abc )
  8.   ;( istree abc )
  9.   ;( setq abc ( BinaryTree 0 bbb ) )
  10.   ;( PreOrder abc )   ;先序遍历
  11.   ;( Inorder abc )    ;中序遍历
  12.   ( Postorder abc )  ;后序遍历
  13. )

  14. ;;;*****************************************************************************
  15. ;;;*****************************************************************************
  16. ;;;函数名  : BinaryTree ********************************************************
  17. ;;;说  明  : 仅适用于顺序存储转满二叉树的形式***********************************
  18. ;;;功  能  : 顺序存储转二叉树***************************************************
  19. ;;;参  数  : i 二叉树深度*******************************************************
  20. ;;;参  数  : datalist 顺序存储表************************************************
  21. ;;;返回值  : 二叉树格式*********************************************************
  22. ;;;例  子  : ( 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 )顺序表***********************
  23. ;;;输  出  : (0 (1 (3 7 8) (4 9 10)) (2 (5 11 12) (6 13 14))) 输出二叉树格式****
  24. ( defun BinaryTree ( i datalist / left mid n right )
  25.   ( setq mid nil )
  26.   ( setq left nil )
  27.   ( setq right nil )
  28.   ( setq n ( length datalist ) )
  29.   (  cond ( ( <= i ( - ( / ( - n 1 ) 2 ) 1 ) )
  30.            ( progn           
  31.             ( setq mid ( nth i datalist )   
  32.                             left ( BinaryTree ( + ( * 2 i ) 1 ) datalist )
  33.                              right ( BinaryTree ( + ( * 2 i ) 2 ) datalist )
  34.                      )
  35.              ( list mid left right )
  36.            )           
  37.                    )
  38.          ( ( and ( > i ( - ( / ( - n 1 ) 2 ) 1 ) )
  39.                  ( < i n ) )
  40.            ( setq mid ( nth i datalist ) )            
  41.          )
  42.          ( t nil )
  43.   )
  44. )
  45. ;;;*****************************************************************************
  46. ;;;*****************************************************************************


  47. ;;;*****************************************************************************
  48. ;;;*****************************************************************************
  49. ;;;函数名  : istree ************************************************************
  50. ;;;说  明  : 判断表数据是否符合满二叉树的格式***********************************
  51. ;;;参  数  : i 二叉树深度*******************************************************
  52. ;;;参  数  : datalist 顺序存储表************************************************
  53. ;;;返回值  : 二叉树格式*********************************************************
  54. ;;;例  子  : (istree (a (b nil nil) nil)) 二叉树格式****************************
  55. ;;;输  出  : T 输出真值*********************************************************
  56. ;;;例  子  : (istree (a (b nil nil))) 非二叉树格式******************************
  57. ;;;输  出  : NIL 输出假值*******************************************************
  58. ( defun istree ( treelist / left right root )
  59.     ( if ( or ( eq nil treelist ) ( null treelist ) )  ;empty is a tree
  60.          t
  61.          ( if ( = ( length treelist ) 3 )               
  62.               ( progn
  63.                 ( setq  root  ( atom ( car treelist ) ) )
  64.                 ( setq  left  ( istree ( cadr treelist ) ) )
  65.                 ( setq  right ( istree ( caddr treelist ) ) )
  66.                 ( and   root left right )                 
  67.               )
  68.               nil
  69.          )   
  70.     )      
  71. )
  72. ;;;*****************************************************************************
  73. ;;;*****************************************************************************



  74. ;;;*****************************************************************************
  75. ;;;*****************************************************************************
  76. ;;;函数名  : PreOrder **********************************************************
  77. ;;;说  明  : 满二叉树的先序遍历*************************************************
  78. ;;;参  数  : treedata 二叉树格式************************************************
  79. ;;;例  子  : (0 (1 (3 7 8) (4 9 10)) (2 (5 11 12) (6 13 14)))*******************
  80. ;;;输  出  : 0 1 3 7 8 4 9 10 2 5 11 12 6 13 14 先序遍历输出********************
  81. ( defun PreOrder ( treedata )
  82.   ( if ( not ( atom treedata ) )
  83.     ( progn
  84.         ( princ "\n" )
  85.         ( if ( atom ( car treedata ) )
  86.              ( princ ( car treedata ) )
  87.         )
  88.         ( princ "\n" )
  89.         ( if ( atom ( cadr treedata ) )
  90.              ( princ ( cadr treedata ) )
  91.         )
  92.         ( princ "\n" )
  93.         ( if ( atom ( caddr treedata ) )
  94.              ( princ ( caddr treedata ) )
  95.         )
  96.         ( princ "\n" )
  97.         ( PreOrder ( cadr treedata ) )
  98.         ( PreOrder ( caddr treedata ) )
  99.     )
  100.   )
  101. )
  102. ;;;*****************************************************************************
  103. ;;;*****************************************************************************



  104. ;;;*****************************************************************************
  105. ;;;*****************************************************************************
  106. ;;;函数名  : Inorder ***********************************************************
  107. ;;;说  明  : 满二叉树的中序遍历*************************************************
  108. ;;;参  数  : treedata 二叉树格式************************************************
  109. ;;;例  子  : (0 (1 (3 7 8) (4 9 10)) (2 (5 11 12) (6 13 14)))*******************
  110. ;;;输  出  : 7 3 8 1 9 4 10 0 11 5 12 2 13 6 14 中序遍历输出********************
  111. ( defun Inorder ( treedata )
  112.   ( if ( not ( atom treedata ) )
  113.     ( progn
  114.         ( Inorder ( cadr treedata ) )
  115.         ( princ "\n" )
  116.         ( if ( atom ( cadr treedata ) )
  117.              ( princ ( cadr treedata ) )
  118.         )
  119.         ( princ "\n" )
  120.         ( if ( atom ( car treedata ) )
  121.              ( princ ( car treedata ) )
  122.         )
  123.         ( princ "\n" )
  124.         ( if ( atom ( caddr treedata ) )
  125.              ( princ ( caddr treedata ) )
  126.         )
  127.         ( princ "\n" )
  128.         ( Inorder ( caddr treedata ) )
  129.     )
  130.   )
  131. )
  132. ;;;*****************************************************************************
  133. ;;;*****************************************************************************



  134. ;;;*****************************************************************************
  135. ;;;*****************************************************************************
  136. ;;;函数名  : Postorder *********************************************************
  137. ;;;说  明  : 满二叉树的后序遍历*************************************************
  138. ;;;参  数  : treedata 二叉树格式************************************************
  139. ;;;例  子  : (0 (1 (3 7 8) (4 9 10)) (2 (5 11 12) (6 13 14)))*******************
  140. ;;;输  出  : 7 8 3 9 10 4 1 11 12 5 13 14 6 2 0 后序遍历输出********************
  141. ( defun Postorder ( treedata )
  142.   ( if ( not ( atom treedata ) )
  143.     ( progn
  144.         ( Postorder ( cadr treedata ) )
  145.         ( Postorder ( caddr treedata ) )
  146.       
  147.         ( princ "\n" )
  148.         ( if ( atom ( cadr treedata ) )
  149.              ( princ ( cadr treedata ) )
  150.         )
  151.         ( princ "\n" )
  152.         ( if ( atom ( caddr treedata ) )
  153.              ( princ ( caddr treedata ) )
  154.         )
  155.         ( princ "\n" )
  156.         ( if ( atom ( car treedata ) )
  157.              ( princ ( car treedata ) )
  158.         )
  159.         ( princ "\n" )
  160.     )
  161.   )
  162. )
  163. ;;;*****************************************************************************
  164. ;;;*****************************************************************************



  165. ;;;*****************************************************************************
  166. ;;;*****************************************************************************
  167. ;;;函数名  : PreOrder2 *********************************************************
  168. ;;;说  明  : 满二叉树的先序遍历*************************************************
  169. ;;;参  数  : treedata 二叉树格式************************************************
  170. ;;;例  子  : (0 (1 (3 7 8) (4 9 10)) (2 (5 11 12) (6 13 14)))*******************
  171. ;;;输  出  : 0 1 3 7 8 4 9 10 2 5 11 12 6 13 14 先序遍历输出********************
  172. ( defun PreOrder2 ( treedata )
  173.   ( if ( not ( atom treedata ) )
  174.     ( progn
  175.         ( princ "\n" )
  176.         ( if ( atom ( car treedata ) )
  177.              ( princ ( car treedata ) )
  178.         )
  179.         ( princ "\n" )
  180.         ( if ( atom ( cadr treedata ) )
  181.              ( princ ( cadr treedata ) )
  182.         )
  183.         ( princ "\n" )
  184.         ( if ( atom ( caddr treedata ) )
  185.              ( princ ( caddr treedata ) )
  186.         )
  187.         ( princ "\n" )
  188.         ( PreOrder2 ( cadr treedata ) )
  189.         ( PreOrder2 ( caddr treedata ) )
  190.     )
  191.   )
  192. )
  193. ;;;*****************************************************************************
  194. ;;;*****************************************************************************

评分

参与人数 4明经币 +4 金钱 +60 收起 理由
tigcat + 1 + 10 很给力!
guosheyang + 1 赞一个!
飞雪神光 + 1 + 50 赞一个!
自贡黄明儒 + 1

查看全部评分

发表于 2022-10-28 10:41:49 | 显示全部楼层
cad是近视眼,用ssget等函数有些选择失误,这时候遍历整个图形。如果采用此法,是不是比全图选择快些?
发表于 2022-10-28 10:43:46 | 显示全部楼层
自贡黄明儒 发表于 2022-10-28 10:41
cad是近视眼,用ssget等函数有些选择失误,这时候遍历整个图形。如果采用此法,是不是比全图选择快些?

遍历图形要用四叉树或者八叉树
 楼主| 发表于 2022-10-28 10:50:31 | 显示全部楼层
自贡黄明儒 发表于 2022-10-28 10:41
cad是近视眼,用ssget等函数有些选择失误,这时候遍历整个图形。如果采用此法,是不是比全图选择快些?

是的  在不涉及交互的时候
尽量不用选择集
用过滤或者遍历
也有人说,过滤也可以不用 这个就不知道为什么了
发表于 2022-10-28 18:56:36 | 显示全部楼层
能根据前序遍历和中序遍历得出后续遍历吗?
发表于 2022-10-31 17:56:57 | 显示全部楼层
期待大神开发出这种算法的用处就好
发表于 2022-11-2 00:13:09 | 显示全部楼层
本帖最后由 dcl1214 于 2022-11-3 09:38 编辑

我用【迪杰斯特拉】【弗洛伊德】【图论】算法实现过,地图200个分叉点,80万条路径计算很快的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-16 00:44 , Processed in 0.191963 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表