O(1)空间复杂度删除一棵二叉树

 

删除一棵二叉树,不能递归,不能用栈,空间复杂度必须为O(1).其思想是利用每个节点的左指针,将后序遍历中需要压入栈的节点就地连成一个链式栈。

 

DeleteBtree(Node* head)
{
        Node 
*stack = NULL;
        Node 
*= head->left,q;
        head
->left = stack;
        stack 
= head;
        
while(stack != NULL)
        
{
                
while(p != NULL)
                
{
                        q 
= p;
                        p 
= q->left;
                        q
->left = stack;
                        stack 
= q;
                }
 
                p 
= stack;
                
if(p->right != NULL)
                
{
                        q 
= p;
                        p 
= q->right;
                        q
->right = NULL;  // 右子树已经访问完
                }
 
                
else 
                
{
                        stack 
= p->left;
                        free(p);
                        p 
= NULL;
                }
 
        }
 
}


 

 忘了从哪看的了,很抱歉不能给出源blog地址。

=============================================================================================================

 

 

楼主,你画个树,然后在图上跟着算法走一遍就大概明白了,这个算法写得相当精妙,呵呵。
我看了一下,大概是这么个意思:
1.while(p != NULL)这个循环是将所有的左子结点链接成一个堆栈,这个堆栈是stack指示的,一开始这个循环是将整棵树的左子树结点链接成堆栈;
2.然后,从这个循环体下面那句“p = stack”开始,它检查堆栈中元素的右子结点是否还有元素,如果没有,直接从堆栈中free掉,如果有,就将右子树作为考虑的对象,又像1中那样将这棵右子树的所有左子结点连接到这个stack中
最后,整棵树就被free掉了,我觉得这个head应该是个指示器,它本身不代表二叉树结点,而是用它的左子结点指示该树的根

===================================================


 

阅读更多
文章标签: null 算法 blog
个人分类: 数据结构
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭