关闭

四:二叉树的镜像递归非递归求解

标签: 二叉树镜像镜像非递归求二叉树镜像
420人阅读 评论(0) 收藏 举报
分类:

先序遍历树的每个结点,若遍历到的结点有子结点,则交换它的两个子结点。

 

1. 递归求解:

voidMirroRecursively(BinaryTreeNode *pNode) 

    if(NULL == pNode) 

        return; 

    if(NULL == pNode->Left && NULL== pNode->Right) 

        return; 

     

    BinaryTreeNode *pTemp =pNode->Left; 

    pNode->Left = pNode->Right; 

    pNode->Right = pTemp; 

     

    if(pNode->Left) 

        MirroRecursively(pNode->Left); 

    if(pNode->Right) 

        MirroRecursively(pNode->Right); 

2. 非递归求解(借助栈)

借助于栈,先交换两棵子树,再求完一棵子树的镜像后在求另一棵子树的镜像(纵向,深度优先)

voidMirrorNonRecurively(BinaryTreeNode *pNode) 

    if(NULL == pNode) 

        return; 

 

    stack<BinaryTreeNode *>stackTreeNode; 

    stackTreeNode.push(pNode); 

 

    while(stackTreeNode.size()) 

    { 

        BinaryTreeNode *pNode =stackTreeNode.top(); 

        stackTreeNode.pop(); 

 

        if(NULL != pNode->Left || NULL !=pNode->Right) 

        { //交换

            BinaryTreeNode *pTemp =pNode->Left; 

            pNode->Left =pNode->Right; 

            pNode->Right = pTemp; 

        } 

         

        if(NULL != pNode->Left) 

           stackTreeNode.push(pNode->Left); 

 

        if(NULL != pNode->Right) 

           stackTreeNode.push(pNode->Right); 

    } 

}

3. 非递归求解(借助队列)

借助于队列以用广度优先的顺序遍历一遍实现逐层镜像(横向,广度优先)

voidMirrorNonRecurively (BinaryTreeNode * root)

 { 

    queue< BinaryTreeNode *> q; 

    q.push(root); 


    while(!q.empty())

   { 

        BinaryTreeNode * r = q.front(); 

        q.pop(); 

        if(r->pLeft != NULL)

             q.push(r->pLeft); 

        if(r->pRight != NULL)

             q.push(r->pRight);

 

////交换

        BinaryTreeNode * temp =r->pLeft; 

        r->pLeft = r->pRight; 

        r->pRight = temp; 

    } 

}  

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:13075次
    • 积分:397
    • 等级:
    • 排名:千里之外
    • 原创:27篇
    • 转载:2篇
    • 译文:0篇
    • 评论:0条
    文章存档