【题目】

输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。

例如输入:

8
    /  \
  6      10
 /\       /\
5  7    9   11

输出:

8
    /  \
  10    6
 /\      /\
11  9  7  5

【递归实现】

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
void Swap(BSTreeNode *left, BSTreeNode *right)
{
    BSTreeNode *temp = left;
    left = right;
    right = temp;
}

///////////////////////////////////////////////////////////////////////
// Mirror a BST (swap the left right child of each node) recursively
// the head of BST in initial call
///////////////////////////////////////////////////////////////////////
void MirrorRecursively(BSTreeNode *pNode)
{
    if(pNode == NULL || (pNode->m_pLeft == NULL && pNode->m_pRight == NULL) )
        return;

// swap the right and left child sub-tree
    Swap(pNode->m_pLeft, pNode->m_pRight);

// mirror left child sub-tree if not null
    if(pNode->m_pLeft)
        MirrorRecursively(pNode->m_pLeft);

// mirror right child sub-tree if not null
    if(pNode->m_pRight)
        MirrorRecursively(pNode->m_pRight);
}

【非递归实现】

由于递归的本质是编译器生成了一个函数调用的栈,因此用循环来完成同样任务时最简单的办法就是用一个辅助栈来模拟递归。首先我们把树的头结点放入栈中。在循环中,只要栈不为空,弹出栈的栈顶结点,交换它的左右子树。如果它有左子树,把它的左子树压入栈中;如果它有右子树,把它的右子树压入栈中。这样在下次循环中就能交换它儿子结点的左右子树了。参考代码如下:

 C++ Code 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
///////////////////////////////////////////////////////////////////////
// Mirror a BST (swap the left right child of each node) Iteratively
// Input: pTreeHead: the head of BST
///////////////////////////////////////////////////////////////////////
void MirrorIteratively(BSTreeNode *pTreeHead)
{
    if(!pTreeHead)
        return;

std::stack<BSTreeNode *> stackTreeNode;
    stackTreeNode.push(pTreeHead);

while(!stackTreeNode.empty())
    {
        BSTreeNode *pNode = stackTreeNode.top();
        stackTreeNode.pop();

// swap the right and left child sub-tree
        //BSTreeNode *pTemp = pNode->m_pLeft;
        //pNode->m_pLeft = pNode->m_pRight;
        //pNode->m_pRight = pTemp;
        Swap(pNode->m_pLeft,pNode->m_pRight);

// push left child sub-tree into stack if not null
        if(pNode->m_pLeft)
            stackTreeNode.push(pNode->m_pLeft);

// push right child sub-tree into stack if not null
        if(pNode->m_pRight)
            stackTreeNode.push(pNode->m_pRight);
    }
}

【参考】

http://zhedahht.blog.163.com/blog/static/2541117420072159363370/

11.求二元查找树的镜像[MirrorOfBST]的更多相关文章

  1. IT公司100题-15-求二元查找树的镜像

    问题描述: 输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树.   例如输入:   6/    \4     12/ \   /   \2  5 8   16 输出:   6/ ...

  2. 1.把二元查找树转变成排序的双向链表[BST2DoubleLinkedList]

    [题目]:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表.要求不能创建任何新的结点,只调整指针的指向. 比如将二元查找树 . 10 / \ 6 14 / \ / \ 4 8 12 16 转 ...

  3. 6.二元查找树的后序遍历结果[PostOrderOfBST]

    [题目] 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果.如果是返回true,否则返回false. 例如输入5.7.6.9.11.10.8,由于这一整数序列是如下树的后序遍历结果: 8 ...

  4. MS - 1 - 把二元查找树转变成排序的双向链表

    ## 1. 把二元查找树转变成排序的双向链表 ## ### 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表. ### 要求不能创建任何新的结点,只调整指针的指向. 10       ...

  5. 二元查找树转变成排序的双向链表之C#算法实现

    此题为July在CSDN发布的微软编程面试100题中的第一题,觉得蛮有趣的,今天也拿过来玩玩,July的代码用的是C++实现,可能因为有指针的原因吧,感觉看起来相对比较容易理解整个的实现过程,而我,试 ...

  6. IT公司100题-9-判断整数序列是不是二元查找树的后序遍历结果

    问题描述: 输入一个整数数组,判断该数组是不是某二元查找树的后序遍历的结果. 如果是返回true,否则返回false. 例如输入4, 8, 6, 12, 16, 14, 10,由于这一整数序列是如下树 ...

  7. 【Data structure & Algorithm】把二元查找树转变成排序的双向链表

    把二元查找树转变成排序的双向链表 题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表,要求不能创建任何新节点,只调整指针指向. 比如将二元查找树 10 /       \ 6       ...

  8. 浅谈算法和数据结构: 十 平衡查找树之B树

    前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为“在计算机科学中,B树(B-tree)是一种 ...

  9. 转 浅谈算法和数据结构: 十 平衡查找树之B树

    前面讲解了平衡查找树中的2-3树以及其实现红黑树.2-3树种,一个节点最多有2个key,而红黑树则使用染色的方式来标识这两个key. 维基百科对B树的定义为"在计算机科学中,B树(B-tre ...

随机推荐

  1. smarty基础原理

    smarty基础原理 一.html模板页面 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  2. springmvc 自定义拦截器

    <mvc:interceptors> <!-- 配置自定义的拦截器 --> <bean class="com.atguigu.springmvc.interce ...

  3. ruby安装神器rvm,你造吗?

    以前的一篇文章介绍过如何安装ruby,叫做:如何安装/更新ruby,安装cocoapods,为开发做好准备!(2016年12月07日更新内容) 文章中讲到的方法依然可行,但是该方法繁琐并且可能会出现各 ...

  4. 双摄像头测距的OpenCV实现

    http://blog.csdn.net/scyscyao/article/details/5562024 版权声明:本文为博主原创文章,未经博主允许不得转载. 虽然最近注意力已经不可遏制地被神经科学 ...

  5. 20145219 《Java程序设计》第09周学习总结

    20145219 <Java程序设计>第09周学习总结 教材学习内容总结 JDBC入门 JDBC简介 1.JDBC是java联机数据库的标准规范,它定义了一组标准类与接口,应用程序需要联机 ...

  6. HDU 1532 --&&-- POJ1273 dinic 算法

    学长的代码#include<stdio.h> #include<string.h> #include<queue> #include<algorithm> ...

  7. Hibernate -- 配置c3p0连接池, 事务隔离级别, 管理session

    知识点1:配置c3p0连接池(了解) * 引入c3p0-0.9.1.jar * 在hibernate.cfg.xml文件中增加如下配置 <!-- C3P0连接池设定--> <!-- ...

  8. Socket初步了解

    在这之前我们先了解一下一些关于网络编程的概念 网络编程从大方面说就是对信息的发送和接收,中间传输为物理线路的作用,编程人员可以不用考虑 网络编程最主要的工作就是在发送端吧信息通过规定好的协议进行组装包 ...

  9. Software Engineering at Google

    Google的Fergus Henderson在Software Engineering at Google中介绍了Google的软件工程实践. 软件开发 源码仓库 单一源代码仓库,除了核心配置和安全 ...

  10. Ubuntu chrome FQ

    按照文档FQ,需要注意一下两点: 1. 在安装Chrome 下的 SwitchyOmega 插件时,拖入到浏览器不能识别,应该打开chrome://extensions/再拖入: 2.在设置时排列列表 ...