问题描述:

输入一颗二元查找树,将该树转换为它的镜像树,即对每一个节点,互换左右子树。
 
例如输入:
  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. 11.求二元查找树的镜像[MirrorOfBST]

    [题目] 输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点.用递归和循环两种方法完成树的镜像转换. 例如输入: 8    /  \  6      1 ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. python 暴力破解密码脚本

    python 暴力破解密码脚本 以下,仅为个人测试代码,环境也是测试环境,暴力破解原理都是一样的, 假设要暴力破解登陆网站www.a.com 用户 testUser的密码, 首先,该网站登陆的验证要支 ...

  2. Windows高精度时间

    目录 第1章计时    1 1.1 GetTickCount    1 1.2 timeGetTime    1 1.3 QueryPerformanceCounter    1 1.4 测试     ...

  3. java 集合(Map3)

    Map接口下的实现类: HashMap 1.存储原理: 向HashMap中添加元素时,首先会调用hashCode(),算的哈希值,然后 算出该元素在哈希表中的存储位置. 情况1 情况2(java  集 ...

  4. struts2后台返回json到jsp页面

    1.在action定义一个全局变量如: private Map<String, Object> dataMap; 2.控制层方法 说明:主要的目的是把我们定义的Map转为Json对象,然后 ...

  5. 能源项目xml文件 -- springMVC-servlet.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. sass less

    CSS 预处理器技术已经非常的成熟,而且也涌现出了越来越多的 CSS 的预处理器框架.本文向你介绍使用最为普遍的三款 CSS 预处理器框架,分别是 Sass.Less CSS.Stylus. 首先我们 ...

  7. Java中print、printf、println

    Java中的System.out输出会用到print.println以及printf命令. 其中 print一般的标准输出,但是不换行. println对比print即在结尾处多了换行.  eg:pr ...

  8. python 使用*args 和**kwargs

    def fun_var_args(farg, *args): print "arg:", farg for value in args: print "another a ...

  9. MySQL学习笔记_1_MySQL数据库管理系统概述

    1. MySQL架构 C/S: client / server架构 MySQL DBMS(Data Bank Management System): 数据库管理系统 客户端 <---> 服 ...

  10. memset,memcpy,memcmp用法

    void* memset(void *s, int ch, size_t n); 将s所指向的某一块内存中的前n个字节的内容全部设置为ch指定的ASCII值. 例如:memset(lpMyStruct ...