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

原创 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; 

    } 

}  

二叉树(11)----求二叉树的镜像,递归和非递归方式

1、二叉树定义: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct...
  • beitiandijun
  • beitiandijun
  • 2014年12月16日 13:26
  • 2615

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

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

笔试面试算法经典--二叉树的镜像-递归与非递归实现(Java)

给出一棵二叉树,求它的镜像,如下图:右边是二叉树是左边二叉树的镜像。解法1(递归)思路1:如果当前节点为空,返回,否则交换该节点的左右节点,递归的对其左右节点进行交换处理。public static ...
  • u013309870
  • u013309870
  • 2017年04月10日 19:04
  • 1025

二叉树的镜像

面试题19:二叉树的镜像
  • yuzhongchun
  • yuzhongchun
  • 2014年09月30日 17:02
  • 10873

二叉树镜像(C++版)

题目: 给定源二叉树,设计算法实现其镜像。 思路: 对于二叉树问题,需要思考除递归方法外的非递归实现。 本题递归很好实现,对于遍历到的头结点,每次交换其左右子树即可。之后对其子树递归调...
  • u013575812
  • u013575812
  • 2015年11月30日 21:28
  • 752

递归和非递归方法建立二叉树

研三了,天天忙着找工作,细数来看过的算法也算多了,但是都是在不同的电脑上看的,而且都没有记录,因此开通此博客用于记录平时看书的笔记或者笔试题目,算法等的解释,写于此便于自己日后回顾和让其他在招工的同学...
  • hailong0715
  • hailong0715
  • 2013年08月30日 16:45
  • 2308

二叉树的递归与非递归实现

二叉树的递归实现: #include using namespace std; #define LEN sizeof(struct Tree) struct Tree { int key; ...
  • z84616995z
  • z84616995z
  • 2014年03月09日 18:33
  • 1485

剑指offer---二叉树的镜像---java实现

题目描述 操作给定的二叉树,将其变换为源二叉树的镜像。  输入描述: 二叉树的镜像定义:源二叉树         8        /  \       6   10      / ...
  • snow_7
  • snow_7
  • 2016年07月04日 20:23
  • 2217

二叉树镜像

题目:有一颗二叉树,将该树转换为它的镜像。  例如输入:      2     /  \   3      4  /\       /\ 5  6   7  8 输出:      2     ...
  • wangqiaozhi
  • wangqiaozhi
  • 2014年03月06日 11:03
  • 327

二叉树的四种遍历的递归和非递归的实现

二叉树的三种遍历为:前序遍历,中序遍历和后序遍历。 遍历的实现可分为递归和非递归。递归法与二叉树的定义相似,非递归法采用栈去模拟实现。 一、前序遍历的次序为:根结点——左结点——右结点。 递归法实现:...
  • xiaominkong123
  • xiaominkong123
  • 2016年06月02日 16:50
  • 471
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:四:二叉树的镜像递归非递归求解
举报原因:
原因补充:

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