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

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

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;

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-12 07:52:00

四:二叉树的镜像递归非递归求解的相关文章

二叉树总结—建树和4种遍历方式(递归&amp;&amp;非递归)

今天总结一下二叉树,要考离散了,求不挂!二叉树最重要的就是 建立.4种遍历方式,简单应用,如何判断两颗二叉树是否相似 二叉树分为 :1.完全二叉树  2.满二叉树 结构性质: 1).满二叉树 高度为h ,节点数则为 2^h - 1,且叶子节点全在最下层,且叶子节点数为2^(n-1)个{n代表二叉树层数,也叫深度} 2).n个节点的 完全二叉树 深度为 int(log2n)(以2为底n的对数)+ 1: 3).非空二叉树 叶子节点个数==双分支节点数+1 4).非空二叉树 某节点编号 n  若有左孩

递归非递归的二叉树遍历(递归前中后,非递归前中后,层次遍历,凹入打印法等)

由于所有的递归算法都可以借助于堆栈转换成循环结构的非递归算法.方法一:形式化模拟转换.方法二:根据要求解问题的特点设计借助于堆栈的循环结构算法.而此次正好是利用第二种按方法求解. 1.1非递归前序遍历: 首先利用下图来设计非递归前序遍历算法思想: 堆栈结构体如下: #define size 100 typedef struct { DataType data[size]; int tag[100]; //这个是在非递归后序中用到 int top : }SeqStack : (1)初始化设置一个堆

二叉树的先序、中序以及后序遍历(递归 &amp;&amp; 非递归)

树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二叉树: //递归建立二叉树 public static void BuildTree(TreeNode node, int data){ if(node == null){ node = new TreeNode(data); } if(data <= node.val){ if(node.left

【数据结构与算法】二叉树深度遍历(非递归)

据说这个笔试面试的时候非常easy考到,所以写到这里. 图示 代码实现 /** * 源代码名称:TreeIteratorNoRecursion.java * 日期:2014-08-23 * 程序功能:二叉树深度遍历(非递归) * 版权:[email protected] * 作者:A2BGeek */ import java.util.Stack; public class TreeIteratorNoRecursion { class TreeNode<T> { private T mNod

快速排序递归非递归队列堆栈实现

递归实现 #include<iostream> using namespace std; template <class T> void QuickSort(T A[],int left,int right) { if(left<right) { int i=left; int j=right+1; do { do i++;while(A[i]<A[left]); do j--;while(A[j]>A[left]); if(i<j) Swap(A[i],A

【算法拾遗】二分查找递归非递归实现

转载请注明出处:http://blog.csdn.net/ns_code/article/details/33747953 本篇博文没太多要说的,二分查找很简单,也是常见常考的查找算法,以下是递归非递归的实现. 非递归实现: /* 非递归实现,返回对应的序号 */ int BinarySearch(int *arr,int len,int key) { if(arr==NULL || len<1) return -1; int low = 0; int high = len-1; while(l

求二叉树镜像的递归非递归实现

1.二叉树定义: [cpp] view plain copy print? typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; typedef struct BTreeNode_t_ { BTreeNodeElement_t     *m_pElemt; struct BTreeNode_t_    *m_pLeft; struct BTreeNode_t_    *m_pRight; } BTreeNod

第4章第3节 二叉树的基本操作(非递归实现)

二叉树的非递归遍历 上一节二叉树的递归遍历中简单介绍了二叉树的递归遍历的实现方式,本节主要介绍二叉树的非递归遍历实现,继续引用上节的例子来说明下. 一.先序遍历 二叉树先序遍历的访问顺序为:根结点->左孩子->右孩子.简单的说,对于任意一个结点,均可以看作是根结点,直接对其访问,如果访问完成后,左孩子不为空,则可以将该左孩子再次看成一个新的根结点,那么就又回到开始,访问根结点,访问左孩子,如果左孩子为空时,访问它的右孩子.对于一般程序而言,递归程序转为非递归程序需要引入栈这个数据结构,可以参考

二叉树的前序/中序/后续遍历(递归+非递归)

这几日又把二叉树的递归写了一遍,原来是用C写的,自己写了一个栈,这一次直接用的C++,使用了自带的栈结构.代码如下: 1 /************************************************************************* 2 > Author: Yves 3 > E-mail: [email protected] 4 > File Name: BiTreeNew.cpp 5 > Description: ... 6 > Cre