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

1、二叉树定义:

[cpp] view plain copy

print?

  1. typedef struct BTreeNodeElement_t_ {
  2. void *data;
  3. } BTreeNodeElement_t;
  4. typedef struct BTreeNode_t_ {
  5. BTreeNodeElement_t     *m_pElemt;
  6. struct BTreeNode_t_    *m_pLeft;
  7. struct BTreeNode_t_    *m_pRight;
  8. } BTreeNode_t;

2、求二叉树镜像

例如:

A                                                                    A

B                C                    ====>                    C             B

D     E                                                                             E       D

(1)递归方式

如果pRoot为NULL,则为空树,返回;

如果pRoot不为NULL,交换pRoot左右结点,然后分别求左右子树的镜像;

[cpp] view plain copy

print?

  1. void  BTreeMirror( BTreeNode_t *pRoot){
  2. if( pRoot == NULL )
  3. return ;
  4. BTreeNode_t *pTemp = pRoot->m_pLeft;
  5. pRoot->m_pLeft = pRoot->m_pRight;
  6. pRoot->m_pLeft = pTemp;
  7. BTreeMirror( pRoot->m_pLeft);
  8. BTreeMirror( pRoot->m_pRight);
  9. return;
  10. }

(2)非递归方式

步骤描述:借助队列

首先,将根节点pRoot入队;

第一步:当队列未空时,获取当前层次的节点总数,即当前队列的长度;执行第二步;

第二步:按照当前层的节点总数,出队进行遍历节点,在遍历时,交换左右节点,如果左右节点存在,则入队;当遍历完当前层所有节点时,遍历下一层,执行第一步。

[cpp] view plain copy

print?

    1. void   BTreeMirror( BTreeNode_t *pRoot){
    2. if( pRoot == NULL )
    3. return NULL;
    4. queue <BTreeNode_t *> que;
    5. que.push(pRoot);
    6. int curLevelNodesTotal = 0;
    7. while( !que.empty()){
    8. curLevelNodesTotal = que.size();
    9. int cnt = 0;
    10. while( cnt < curLevelNodesTotal ){
    11. ++cnt;
    12. pRoot = que.front();
    13. que.pop();
    14. BTreeNode_t *pTemp = pRoot->m_pLeft:
    15. pRoot->m_pLeft = pRoot->m_pRight;
    16. pRoot->m_pRight = pTemp;
    17. if( pRoot->m_pLeft != NULL)
    18. que.push( pRoot->m_pLeft);
    19. if( pRoot->m_pRight != NULL )
    20. que.push( pRoot->m_pRight);
    21. }
    22. }
    23. return;
    24. }
时间: 2024-12-12 09:49:18

求二叉树镜像的递归非递归实现的相关文章

二叉树总结—建树和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  若有左孩

二叉树的先序、中序以及后序遍历(递归 &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

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

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

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

递归实现 #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

二叉树(7)----求二叉树叶子节点个数,递归和非递归

1.二叉树定义: 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; } BTreeNode_t; 2.求二叉树叶子节点数 叶子节点:即没有左右子树的结点 (1)递归方

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

先序遍历树的每个结点,若遍历到的结点有子结点,则交换它的两个子结点. 1. 递归求解: voidMirroRecursively(BinaryTreeNode *pNode) { if(NULL == pNode) return; if(NULL == pNode->Left && NULL== pNode->Right) return; BinaryTreeNode *pTemp =pNode->Left; pNode->Left = pNode->Righ

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

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