问题描述:

输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树。
 
例如输入:
  6
/    \
4     12
/ \   /   \
2  5 8   16
输出:
  6
/     \
12     4
/   \   / \
16  8 5  2
定义二元查找树的结点为:
typedef struct BSTree {
    int data;
    BSTree* left;
    BSTree* right;
} Node;

分析:

方法1:递归交换左右子树。
// 15_1.cc
#include <iostream>
using namespace std;

typedef struct BSTree {
    int data;
    BSTree* left;
    BSTree* right;
} Node;

// 创建二元查找树
void add_BSTree_node(Node* &p_current, int data) {
    if (NULL == p_current) {
        Node *node = new Node();
        node->left = NULL;
        node->right = NULL;
        node->data = data;
        p_current = node;
    } else {
        if (p_current->data > data)
            add_BSTree_node(p_current->left, data);
        else if (p_current->data < data)
            add_BSTree_node(p_current->right, data);
        else
            cout << "The data has already in the tree.";
    }
}

// 转换二叉树为镜像树
void mirror_change(Node *root) {
    if(!root)
        return;

    // 交换左右子树
    Node* t = root->left;
    root->left = root->right;
    root->right = t;

    // 左右子树分别递归
    if(root->left)
        mirror_change(root->left);
    if(root->right)
        mirror_change(root->right);
}

// 中序打印镜像树
void print_tree(Node* root) {
    if (!root)
        return;
    cout << root->data << " ";
    print_tree(root->left);
    print_tree(root->right);
}

int main() {
    Node *root = NULL;
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );

    mirror_change(root);
    print_tree(root);
    cout << endl;
}

方法2:使用栈模仿递归过程:

// 15_2.cc
#include <iostream>
#include <stack>
using namespace std;

typedef struct BSTree {
    int data;
    BSTree* left;
    BSTree* right;
} Node;

// 创建二元查找树
void add_BSTree_node(Node* &p_current, int data) {
    if (NULL == p_current) {
        Node *node = new Node();
        node->left = NULL;
        node->right = NULL;
        node->data = data;
        p_current = node;
    } else {
        if (p_current->data > data)
            add_BSTree_node(p_current->left, data);
        else if (p_current->data < data)
            add_BSTree_node(p_current->right, data);
        else
            cout << "The data has already in the tree.";
    }
}

// 转换二叉树为镜像树
void mirror_change(Node *root) {
    if(!root)
        return;

    stack<Node*> s;
    s.push(root);
    Node* p;

    while(!s.empty()) {
        p = s.top();
        s.pop();

        // 交换左右子树
        Node* t = p->left;
        p->left = p->right;
        p->right = t;

        // 左右子树分别入栈
        if(p->left)
            s.push(p->left);
        if(p->right)
            s.push(p->right);
    }
}

// 中序打印镜像树
void print_tree(Node* root) {
    if (!root)
        return;
    cout << root->data << " ";
    print_tree(root->left);
    print_tree(root->right);
}

int main() {
    Node *root = NULL;
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );
    add_BSTree_node(root, );

    mirror_change(root);
    print_tree(root);
    cout << endl;
}

IT公司100题-15-求二元查找树的镜像的更多相关文章

  1. IT公司100题-16-层遍历二元树

    问题描述: 层遍历二叉树,同一层从左往右打印. 定义二元查找树的结点为: typedef struct BSTreeNode { int data; BSTreeNode *left; BSTreeN ...

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

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

  3. IT公司100题-4-在二元树中找出和为某一值的所有路径

    问题描述: 输入一个整数和一棵二元树.从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径.打印出和与输入整数相等的所有路径. 例如输入整数30和如下二元树   14 / \ 5 16 / ...

  4. IT公司100题-11-求二叉树中节点的最大距离

    问题描述: 写程序,求一棵二叉树中相距最远的两个节点之间的距离. 10/     \6      14/   \   /   \4    8 12    16 分析: 二叉树中最远的两个节点,要么是根 ...

  5. IT公司100题-1-二叉树转换为双链表

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

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

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

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

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

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

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

  9. IT公司100题-35- 求一个矩阵中最大的二维矩阵(元素和最大)

    问题描述: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 中最大的是: 4 5 9 10   分析: 2*2子数组的最大和.遍历求和,时 ...

随机推荐

  1. 由Memcached升级到 Couchbase的 Java 客户端的过程记录(一)

    背景: 在项目启动的选用了Memcached 作为缓存服务器,采用了Xmemcached作为客户端.在项目中使用了Shiro,为了给 Shiro 配置缓存的时候,采用了开源代码   https://g ...

  2. 关于&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&gt;问题

    我在做网页过程中都是在火狐浏览器下进行的,可是有一次我在IE浏览器下打开时却发现我设置的style.css中的大部分样式都失效率了,这个问题足足困扰了我两天,终于在百度的帮助下找到了答案,原来在网页的 ...

  3. Swift实现截屏并保存相册

    func saveToLocal() { //截屏 let screenRect = UIScreen.mainScreen().bounds UIGraphicsBeginImageContext( ...

  4. get_post

    各种http的请求协议: http://ymiter.iteye.com/blog/1922464 HTTP请求报文和HTTP响应报文 http://www.cnblogs.com/biyeymyhj ...

  5. 欧拉函数 &amp;【POJ 2478】欧拉筛法

    通式: $\phi(x)=x(1-\frac{1}{p_1})(1-\frac{1}{p_2})(1-\frac{1}{p_3}) \cdots (1-\frac{1}{p_n})$ 若n是质数p的k ...

  6. Vno博客样式分享

    不知不觉有一年多没有更新博客了,还是几位园友因为喜欢这套博客样式发了消息,否则我都快忘记自己还有一个博客了,哈哈. 言归正传,这套博客样式是当时闲来无事copy的iOS界喵神的博客Vno,确实很漂亮, ...

  7. bash脚本中的普通数组和关联数组

    1. 普通数组 bash支持一维数组(不支持多维数组),并且没有限定数组的大小.类似与C语言,数组元素的下标由0开始编号.获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0. ...

  8. td内容过长,省略号表示

    .word{ min-width:100px; max-width:200px; overflow:hidden; white-space:nowrap; text-overflow:ellipsis ...

  9. 越狱Season 1- Episode 18: Bluff

    Season 1, Episode 18: Bluff -Michael: Scofield Scofield Michael Scofield Michael Scofield -Patoshik: ...

  10. eclipse下编译hadoop源代码(转)

    hadoop是一个分布式存储和分布式计算的框架.在日常使用hadoop时,我们会发现hadoop不能完全满足我们的需要,我们可能需要修改hadoop的源代码并重新编译.打包. 下面将详细描述如何从sv ...