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

原创 2015年07月07日 14:52:42

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

 

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; 

    } 

}  

相关文章推荐

利用二叉树的非递归后序遍历求解最近公共祖先问题

通过上一篇的博客我们知道,可以利用栈来实现二叉树的后序遍历。其实这里有一个性质,就是当使用非递归后序遍历时,栈中的元素就是当前节点到根节点的路径。利用这个规律,我们就可以求解最近公共最先问题了。 算法...
  • Ajay666
  • Ajay666
  • 2017年08月05日 22:38
  • 269

数据结构-非递归遍历二叉树

  • 2017年11月16日 10:28
  • 216KB
  • 下载

非递归遍历二叉树

  • 2012年08月04日 09:37
  • 2KB
  • 下载

二叉树镜像(递归与非递归)

题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。 如下图所示:右边的二叉树就是左边的树的镜像。我们可以根据照镜子的经验画出它的镜像。 递归思想:这两棵树的根节点相同,但是他们的左右孩子交...

求二叉树镜像 -- 采用递归和非递归方法

/*求二叉树镜像 -- 采用递归和非递归方法 经调试可运行源码及分析如下: ***/ #include #include #include using std::cout; using std::...

二叉树的遍历(非递归)

  • 2014年05月14日 14:39
  • 4KB
  • 下载

Morris Traversal方法遍历二叉树(非递归,不用栈,O(1)空间)

转自http://www.cnblogs.com/AnnieKim/archive/2013/06/15/MorrisTraversal.html 文主要解决一个问题,如何实现二叉树...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:四:二叉树的镜像递归非递归求解
举报原因:
原因补充:

(最多只允许输入30个字)