题目:输入一颗二元查找树,将该树转换为它的镜像,

即在转换后的二元查找树中,左子树的结点都大于右子树的结点。

用递归和循环两种方法完成树的镜像转换。

例如输入:

       8

     /    \

   6     10

  /  \    /   \

 5  7  9    11

输出:

      8

    /   \

  10  6

  /  \  / \

11 9 7 5

分析:

1. 递归,类似与先序和后序遍历。

2. 迭代:可以采用先序,后序的迭代版本,或者采用层序遍历也可。

二叉树的遍历的非递归版本可参考 点击打开链接

// copyrigth @ L.J.SHOU Mar.09, 2014
// find the mirror of a binary tree
#include <iostream>
#include <stack>
#include <queue>
using namespace std; struct TreeNode{
int val;
TreeNode *left, *right;
TreeNode(int x)
:val(x), left(NULL), right(NULL){}
}; // recursive version
TreeNode* Mirror(TreeNode *root)
{
if(root == NULL)
return NULL; swap(root->left, root->right);
root->left = Mirror(root->left);
root->right = Mirror(root->right); return root;
} // iterative version 1
// pre-order traversal
TreeNode* MirrorIterative(TreeNode *root)
{
if(root == NULL) return NULL; TreeNode *p = root;
stack<TreeNode*> s;
while(p || !s.empty())
{
while(p){
swap(p->left, p->right);
s.push(p);
p = p->left;
}
p = s.top(); s.pop();
p = p->right;
}
return root;
} // iterative version 2
// level order traversal
TreeNode* MirrorLevelOrder(TreeNode *root)
{
if(root == NULL) return NULL; TreeNode *node(NULL);
queue<TreeNode *> cur, next;
cur.push(root); while(!cur.empty())
{
while(!cur.empty()){
node = cur.front(); cur.pop();
swap(node->left, node->right);
if(node->left)
next.push(node->left);
if(node->right)
next.push(node->right);
}
swap(cur, next);
}
return root;
} TreeNode* Destroy(TreeNode *root)
{
if(root == NULL) return NULL;
root->left = Destroy(root->left);
root->right = Destroy(root->right);
delete root;
return NULL;
} void InOrder(TreeNode *root)
{
stack<TreeNode*> s; while(root || !s.empty()){
while(root){
s.push(root);
root = root->left;
}
root = s.top(); s.pop();
cout << root->val << " ";
root = root->right;
}
cout << endl;
} int main(void)
{
TreeNode *root(NULL); root = new TreeNode(8);
root->left = new TreeNode(6);
root->right = new TreeNode(10);
root->left->left = new TreeNode(5);
root->left->right = new TreeNode(7);
root->right->left = new TreeNode(9);
root->right->right = new TreeNode(11); root = MirrorLevelOrder(root);
InOrder(root); root = Destroy(root);
return 0;
}

Interview----将一棵二叉树转换成其镜像的更多相关文章

  1. 二叉树转换成森林&amp;森林变成二叉树

    一,树转换成二叉树 1,将全部兄弟结点连起来; 2,保留第一个兄弟结点与父节点的连接,断开其它兄弟结点与父节点的连接,然后以根节点为轴依照顺时针方向旋转45度 watermark/2/text/aHR ...

  2. disk2vhd-----将windows系统转换成虚拟镜像格式

    工具介绍 下载url:http://technet.microsoft.com/en-us/sysinternals/ee656415.aspx disk2vhd是一个非常小的P2V转换工具,可以将你 ...

  3. VirtualBox 原始镜像转换成 vdi 镜像

    VBoxManage convertdd [-static] <filename> <outputfile> 将raw硬盘转换成vdi虚拟硬盘

  4. 【遍历二叉树】11把二叉树转换成前序遍历的链表【Flatten Binary Tree to Linked List】

    本质上是二叉树的root->right->left遍历. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  5. leetcode 114二叉树转换成链表

    解法一 可以发现展开的顺序其实就是二叉树的先序遍历.算法和 94 题中序遍历的 Morris 算法有些神似,我们需要两步完成这道题. 将左子树插入到右子树的地方 将原来的右子树接到左子树的最右边节点 ...

  6. Cracking-- 17.13 将二叉树转换成双向链表

    在书的105页 使用中根遍历的思想 left 之后 为 root 之后 为 right 则对左子树来说 left->right = root; root->left = left; 对右子 ...

  7. lintcode 453 将二叉树拆成链表

    将二叉树拆成链表   描述 笔记 数据 评测 将一棵二叉树按照前序遍历拆解成为一个假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. 注意事项 不要忘记将左儿子标 ...

  8. 【LeetCode-面试算法经典-Java实现】【109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)】

    [109-Convert Sorted List to Binary Search Tree(排序链表转换成二叉排序树)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 ...

  9. 笔试算法题(31):将有序数组转换成BST表示 & 线段树的应用

    出题:要求将一个有序整数数组转换成最小深度的Binary Search Tree表示: 分析:由于需要是最小深度,所以BST应保持平衡,左右节点数大致相当,并且BST中当前根节点大于所有其左子树中的元 ...

随机推荐

  1. Sql Server聚集索引创建

    create CLUSTERED index IX_ZhuiZIDList_ZID on ZhuiZIDList (ZID)

  2. EasyUI TreeGrid

    数据格式1: { , "rows": [ { "id": 1, "name": "All Tasks", "b ...

  3. Java 集合系列 11 hashmap 和 hashtable 的区别

    java 集合系列目录: Java 集合系列 01 总体框架 Java 集合系列 02 Collection架构 Java 集合系列 03 ArrayList详细介绍(源码解析)和使用示例 Java ...

  4. MD4C/CO46/MD04一个很棒的工单缺料分析

    大家好~~~ 之前在MD04物料分析的时候,看到有订单预留,双击有个订单报告可以显示一个订单物料是否缺料清单 这个单独的工单分析可以在T-code:MD4C,CO46查看,如果只是单独的使用,那么这两 ...

  5. python 将数据随机分为训练集和测试集

    # -*- coding: utf-8 -*- """ Created on Tue Jun 23 15:24:19 2015 @author: hd "&qu ...

  6. 去除list集合中重复项的几种方法

    因为用到list,要去除重复数据,尝试了几种方法.记录于此... 测试数据: List<string> li1 = new List<string> { "8&quo ...

  7. 分形树Fractal tree介绍——具体如何结合TokuDB还没有太懂,先记住其和LSM都是一样的适合写密集

    在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...

  8. python的一点小常识

    在Python中,有两种变长参数,分别是元组(非关键字参数)和字典(关键字参数),其参数以一个*开头表示任意长度的元组[tuple],可以接收连续一串参数,参数以两个*开头表示一个字典[dict],即 ...

  9. Computer Science Courses – Yan Yan

    CS: Compilers / Programming Languages Course Title Fundamentals of C++ Language Programming Textbook ...

  10. linux 执行php文件

    /opt/php5/bin/php /home/Xcar/tag/interface/tag_api4hbase.php tag_export2file "/tmp/guo.php" ...