a
    3d]                     @   s	  d dl mZ edg Zedg dZd dlmZmZmZ edZedeeef Z	e	dd	d
Z
ee	e	e	dddZe	edddZe	edddZe	e	dddZe	e	dddZe	edddZe	edddZedededede
 e
 ede
 e
 ed ed!e
 e
 ed"e
 e
 ed#ed$ed%e
 e
 ed&e
 e
 ed'ed(e
 e
 ed)e
 e
 Zed*ed+ed,ed e
 e
 ed-e
 e
 ed.ed/e
 e
 ed0e
 e
 ed1ed2ed3e
 e
 ed4e
 e
 ed5ed6e
 e
 ed7e
 e
 Zededede
 e
 ede
 e
 ed ed!e
 e
 ed"e
 e
 Zed+ed,ed e
 e
 ed-e
 e
 ed.ed/e
 e
 ed0e
 e
 Zedede
 e
 ede
 e
 Zed,ed e
 e
 ed-e
 e
 Zed ed!e
 e
 ed"e
 e
 Zed#ed$ed%e
 e
 ed&e
 e
 ed'ed(e
 e
 ed)e
 e
 Zed$ed%e
 e
 ed&e
 e
 Zed'ed(e
 e
 ed)e
 e
 Zedede
 e
 ed#ed$e
 e
 ed'ed(e
 e
 ed)e
 e
 Zed*ed+e
 e
 ed1ed2e
 e
 ed5ed6e
 e
 ed7e
 e
 Zedededede
 e
 ede
 e
 ed ed!e
 e
 ed"e
 e
 ed#ed$ed%e
 e
 e
 ed'e
 e
 Z ed*ed+ed,ed e
 e
 ed-e
 e
 ed.ed/e
 e
 ed0e
 e
 ed1ed2ed3e
 e
 e
 ed5e
 e
 Z!edededede
 e
 ede
 e
 ed e
 ed"e
 e
 ed#e
 ed'ed(e
 e
 ed)e
 e
 Z"ed*ed+ed,ed e
 e
 ed-e
 e
 ed.e
 ed0e
 e
 ed1e
 ed5ed6e
 e
 ed7e
 e
 Z#d8d9 Z$d:d; Z%d<d= Z&d>d? Z'd@dA Z(dBdC Z)dDdE Z*dFdG Z+dHdI Z,dJdK Z-dLdM Z.e	eggddNdOZ/eggeggeggdPdQdRZ0eggegdSdTdUZ1e	egddVdWZ2e	eggddXdYZ3eggeggeggdPdZd[Z4eggegdSd\d]Z5e	egdd^d_Z6ege	gegd`dadbZ7e	egddcddZ8e	gegdedfdgZ9e	egddhdiZ:e	egddjdkZ;dldm Z<dndo Z=dpdq Z>drds Z?dtdu Z@dvdw ZAdxdy ZBdzd{ ZCd|d} ZDeDeeZEed ed!ede ede ede e ddde ded"e e ddZFeEeFkZGd~d ZHeHeeZIed ed!edede e ede e e ed"e e ZJeIeJkZKdd ZLdd ZMdd ZNdd ZOedg ZPedg dZQedeePeQf ZReRdddZSeeReReRdddZTeRedddZUeRedddZVeRedddZWeReRdddZXeReRdddZYdd ZZdd Z[dd Z\dd Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd ZgdS )    )
namedtupleEmptyBTNodeBT)dataBTleftBTrightBT)TypeVarUnionNewTypeTTree)returnc                   C   s   t  S Nr    r   r   /homepages/33/d289733084/htdocs/OU/M269FolderSync/M269TutorialSamples2023/M269TutorialBinaryTreesCmntry2023/M269TutorialBinaryTrees2022.py	mkEmptyBT   s    r   )xt1t2r   c                 C   s   t | ||S r   )r   )r   r   r   r   r   r   mkNodeBT   s    r   )tr   c                 C   s
   | t  kS r   r   r   r   r   r   	isEmptyBT   s    r   c                 C   s   t | rtdn| jS d S )NzgetDataBT applied to EmptyBT())r   RuntimeErrorr   r   r   r   r   	getDataBT    s    
r   c                 C   s   t | rtdn| jS d S )NzgetLeftBT applied to EmptyBT())r   r   r   r   r   r   r   	getLeftBT&   s    
r   c                 C   s   t | rtdn| jS d S )NzgetRightBT applied to EmptyBT())r   r   r   r   r   r   r   
getRightBT,   s    
r   c                 C   s.   t | rdS dttt| tt|  S d S Nr      )r   maxheightBTr   r   r   r   r   r   r!   2   s
    
r!   c                 C   s,   t | rdS dtt|  tt|  S d S r   )r   sizeBTr   r   r   r   r   r   r"   9   s
    
r"   HDBACFEGLJIKNMO      r                  	      
            c                 C   s2   t | rg S tt| t| g tt|  S d S r   )r   	inOrderBTr   r   r   r   r   r   r   r?   7  s
    
r?   c                 C   s2   t | rg S t| gtt|  tt|  S d S r   )r   r   
preOrderBTr   r   r   r   r   r   r@   >  s
    
r@   c                 C   s2   t | rg S tt| tt|  t| g S d S r   )r   postOrderBTr   r   r   r   r   r   r   rA   E  s    

rA   c                 C   s>   g }t | s:|tt|  }|t|  |tt|  }|S r   )r   
inOrderBT0r   appendr   r   r   resultr   r   r   rB   O  s    rB   c                 C   s8   g }t | s4|tt|  }|t|  t| } q|S r   )r   inOrderIterBT1r   rC   r   r   rD   r   r   r   rF   W  s    
rF   c                 C   sX   g }g }|g krt | sTt | s4||  t| } q| } |t|  t| } q|S r   )r   rC   r   popr   r   r   rE   stackr   r   r   inOrderIterBT2_  s    


rJ   c                 C   s>   g }t | s:|t|  |tt|  }|tt|  }|S r   )r   rC   r   preOrderBT0r   r   rD   r   r   r   rK   l  s    rK   c                 C   s8   g }t | s4|t|  |tt|  }t| } q|S r   )r   rC   r   preOrderIterBT1r   r   rD   r   r   r   rL   t  s    
rL   c                 C   sX   g }g }|g krt | sTt | sB|t|  ||  t| } q| } t| } q|S r   )r   rC   r   r   rG   r   rH   r   r   r   preOrderIterBT2|  s    


rM   c                 C   s>   g }t | s:|tt|  }|tt|  }|t|  |S r   )r   postOrderBT0r   r   rC   r   rD   r   r   r   rN     s    rN   c                 C   s   g }t | r|S g }|g kr$t | st | sZt t| sF|t|  ||  t| } q$| } t t| s|g kr|d t| u r| }||  t| } q|t|  t } q|S )N)r   r   rC   r   rG   r   r   )r   rE   rI   Ztrr   r   r   postOrderIterBT1  s,    



rP   c                 C   sB   t | rg S t| }t| }t| }|ggtt|t| S d S r   )r   r   r   r   longZipMergelevelOrderBTr   r   leftrightr   r   r   rR     s    rR   )xssyssr   c                 C   sH   | g kr|S |g kr| S | d |d  gt | dd  |dd   S d S r   )rQ   rV   rW   r   r   r   rQ     s
    rQ   )levelsr   c                 C   s   dd | D S )Nc                 S   s   g | ]}|D ]}|qqS r   r   ).0levelelemr   r   r   
<listcomp>      z!flattenLevels.<locals>.<listcomp>r   )rY   r   r   r   flattenLevels  s    r_   c                 C   s   t t| S r   )r_   rR   r   r   r   r   breadthBT01  s    r`   c                 C   s@   t | rg S t| }t| }t| }|gtt|t| S d S r   )r   r   r   r   longZipMerge01levelOrderBT01rS   r   r   r   rb     s    rb   c                 C   sF   | g kr|S |g kr| S | d |d gt | dd  |dd   S d S r   )ra   rX   r   r   r   ra     s
    ra   c                 C   s&   g }| D ]}|D ]}||g }qq|S r   r   )rY   Z	accumListr[   r\   r   r   r   flattenLevelsA  s
    rc   c                 C   s   t g | gS r   )
bfTraverser   r   r   r   breadthBT02  s    re   )vstsr   c                 C   sf   |g kr| S t |d r*t| |dd  S t| t|d g |dd  t|d t|d g S d S r   )r   rd   r   r   r   )rf   rg   r   r   r   rd     s    "rd   c                 C   s
   t | gS r   )lbfBTr   r   r   r   breadthBT03  s    ri   )rg   r   c                 C   sb   | g krg S t | d r(t| dd  S t| d gt| dd  t| d t| d g  S d S r   )r   rh   r   r   r   )rg   r   r   r   rh     s    &rh   c                 C   sh   | g}g }|g krdt |d sV|t|d g }|dd  t|d t|d g }q
|dd  }q
|S r   )r   r   r   r   r   rg   rf   r   r   r   breadthBT04  s    &rk   c                 C   s   | g}g }t |std| t |d stdt| tdt|d  |t|d g }|dd  t|d t|d g }q
tddt| |dd  }q
|S )Nzts = r   z
len(ts) = zgetDataBT(ts[0]) = r   zts[0] is empty)r   printlenr   r   r   rj   r   r   r   breadthBT04A  s    
&rn   c                 C   sl   t |rt| t t S t|}| |k rBt|t| t|t|S | |krdt|t|t| t|S |S d S r   )r   r   r   r   	insertBSTr   r   )r   r   yr   r   r   ro   4  s    ro   c                 C   sF   t  r
dS t|}| |k r(t| t|S | |kr>t| t|S dS d S )NFT)r   r   inBSTr   r   )kr   pr   r   r   rq   @  s    rq   c                 C   s   t t| S r   )orderedListr?   r   r   r   r   isBSTreeL  s    ru   c                 C   s,   t | dkp*| d | d k o*t| dd  S Nr   r   )rm   rt   xsr   r   r   rt   O  s    rt   c                 C   s,   | g kr|S t | dd  t| d |S d S rv   )insertListBSTro   rx   r   r   r   r   ry   S  s    ry   c                 C   s   t t t| S r   )bBSTr   sortedrw   r   r   r   buildBST\  s    r}   c                 C   s   |g kr| S t |d }|| }|d | }||d d  }t| r`t|tt |tt |S dt| d t|  }t|d S )Nr4   r   zbBST: Trying to insertz into nonempty tree)rm   r   r   r{   r   strr   )r   rx   Zhalfr   ZfrontxsZbackxsZerrMsgr   r   r   r{   `  s"    


r{   c                 C   sh   t |rt S t|}t|}t|}| |k r@t|t| ||S | |krZt||t| |S t||S d S r   )r   r   r   r   r   r   	deleteBSTjoinBSTr   r   rp   leftTrightTr   r   r   r   s  s    r   c                 C   s   t | r|S tt| |S d S r   )r   ry   r?   r   r   r   r   r   joinBST1  s    r   c                 C   s.   t |r| S tt|t| t|t|S d S r   )r   r   r   joinBST2r   r   r   r   r   r   r     s    r   c                 C   s(   t |r| S t|\}}t|| |S d S r   )r   splitBSTr   r   r   rp   r   r   r   r   r     s    r   c                 C   s`   t | rtdnJt t| r.t| t| fS tt| }|tt| t|t| t| fS d S )NzsplitBST1 applied to EmptyBT())r   r   r   r   r   
minItemBSTr   r   )r   rp   r   r   r   	splitBST1  s    

r   c                 C   s6   t | rtdn t t| r&t| S tt| S d S )NzminItemBST applied to EmptyBT())r   r   r   r   r   r   r   r   r   r     s
    
r   c                 C   sZ   t | rtdnDt| }t| }t| }t |r:||fS t|\}}|t|||fS d S )NzsplitBST applied to EmptyBT())r   r   r   r   r   r   r   r   r   r   r   rp   t3r   r   r   r     s    
r   EmptyABTNodeABT)	heightABTdataABTleftABTrightABTABTreec                   C   s   t  S r   r   r   r   r   r   
mkEmptyABT  s    r   c                 C   s$   dt t|t| }t|| ||S )Nr   )r    getHeightABTr   )r   r   r   hr   r   r   	mkNodeABT  s    r   c                 C   s
   | t  kS r   r   r   r   r   r   
isEmptyABT   s    r   c                 C   s   t | rdS | jS d S Nr   )r   r   r   r   r   r   r     s    r   c                 C   s   t | rtdn| jS d S )Nz getDataABT applied to EmptyABT())r   r   r   r   r   r   r   
getDataABT	  s    
r   c                 C   s   t | rtdn| jS d S )Nz getLeftABT applied to EmptyABT())r   r   r   r   r   r   r   
getLeftABT  s    
r   c                 C   s   t | rtdn| jS d S )Nz!getRightABT applied to EmptyABT())r   r   r   r   r   r   r   getRightABT  s    
r   c                 C   s   t t| S r   )rt   
inOrderABTr   r   r   r   
isBSABTree  s    r   c                 C   s2   t | rg S tt| t| g tt|  S d S r   )r   r   r   r   r   r   r   r   r   r      s
    
r   c                 C   s(   t | rdS tt| tt|  S d S r   )r   r   r   r   r   r   r   r   balFactorABT)  s
    

r   c                 C   s8   t | rdS tt| dko2tt| o2tt| S d S )NTr   )r   absr   hasAVLpropABTr   r   r   r   r   r   r   2  s    

r   c                 C   s   t | ot| S r   )r   r   r   r   r   r   isAVLABTree;  s    r   c                 C   s:   t | rt S tt| }tt| }tt| ||S d S r   )r   r   convertBTtoABTr   r   Z
makeABTreer   )r   r   r   r   r   r   r   @  s
    r   c                 C   sH   t | }t t| }tt| }tt| }t| }t||t|||S r   )r   r   r   r   )r   rr   kLZ	leftLeftTZ
leftRightTr   r   r   r   rotrK  s    
r   c                 C   sF   t | }t t| }tt| }tt| }| j}t|t||||S r   )r   r   r   r   r   )r   rr   kRZ
rightLeftTZrightRightTr   r   r   r   rotlU  s    
r   c                 C   s   t |}t |}|d |k r8t|dkr8tt| ||S |d |k rXtt| t||S |d |k rt|dkrtt| |t|S |d |k rtt| ||S t| ||S d S rv   )r   r   r   r   r   )r   r   r   ZhLZhRr   r   r   makeAVLTreea  s    r   c                 C   sl   t |rt| t t S t|}t|}t|}| |k rJt|t| ||S | |krdt||t| |S |S d S r   )r   r   r   r   r   r   r   
insertAVLTr   r   r   r   r   q  s    r   c                 C   s,   | g kr|S t | dd  t| d |S d S rv   )insertListAVLTr   rz   r   r   r   r     s    r   c                 C   sh   t |rt S t|}t|}t|}| |k r@t|t| ||S | |krZt||t| |S t||S d S r   )r   r   r   r   r   r   
deleteAVLTjoinAVLTr   r   r   r   r     s    r   c                 C   s(   t |r| S t|\}}t|| |S d S r   )r   	splitAVLTr   r   r   r   r   r     s    r   c                 C   sZ   t | rtdnDt| }t| }t| }t |r:||fS t|\}}|t|||fS d S )NzsplitAVLT applied to EmptyABT())r   r   r   r   r   r   r   r   r   r   r   r     s    
r   N)hZcollectionsr   r   r   Ztypingr   r	   r
   r   r   r   r   boolr   r   r   r   intr!   r"   ZegBSTreeZ	egBSTreeNZ	egBSTreeLZ
egBSTreeNLZ
egBSTreeLLZegBSTreeNLLZ
egBSTreeLRZ	egBSTreeRZ
egBSTreeRLZ
egBSTreeRRZ	egBSTree1Z
egBSTreeN1Z	egBSTree2Z
egBSTreeN2Z	egBSTree3Z
egBSTreeN3r?   r@   rA   rB   rF   rJ   rK   rL   rM   rN   rP   rR   rQ   r_   r`   rb   ra   rc   re   rd   ri   rh   rk   rn   ro   rq   ru   rt   ry   r}   r{   r   r   ZdelBSTreeJoin1ZdelBSTreeJoin1ansZdelBSTreeJoin1testr   ZdelBSTreeJoin2ZdelBSTreeJoin2ansZdelBSTreeJoin2testr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s^  









		
		



			
	