

题目
解决代码及点评
/*
输入一颗二元查找树,将该树转换为它的镜像
镜像的意思是原来二叉搜索树,是左子树<root <右子树,镜像后,左子树 > root > 右子树
*/
#include <iostream>
using namespace std;
// 树节点,包括左二子、右儿子指针和保存的值
class TreeNode
{
public:
TreeNode* _left;
TreeNode* _right;
int _val;
TreeNode(int val, TreeNode* left = NULL, TreeNode* right = NULL) :
_val(val), _left(left), _right(right){}
};
// 二叉树类
class BSTree
{
public:
TreeNode* _root;
BSTree(TreeNode* root = NULL) : _root(root) {}
// 往树里增加元素
void add(int val)
{
add(_root, val);
}
// 中序遍历并打印输出
void midOrder()
{
cout << "中序遍历输出序列:";
midOrder(_root);
cout << endl;
}
// 做镜像
void mirror()
{
mirror(_root);
}
private:
// 镜像,使用递归进行镜像,具体的做法为交换左右儿子,然后递归的对左右子树做镜像
void mirror(TreeNode* root)
{
if (root == NULL) return;
TreeNode* tmp = root->_left;
root->_left = root->_right;
root->_right = tmp;
mirror(root->_left);
mirror(root->_right);
}
// 中序遍历并打印序列,也用了递归
void midOrder(TreeNode* root)
{
if (root == NULL) return;
midOrder(root->_left);
cout << root->_val << " ";
midOrder(root->_right);
}
// 使用递归比较简单
void add(TreeNode*& root, int val)
{
// 如果比根节点大,则添加到右子树,否则添加到左子树
if (root == NULL) root = new TreeNode(val);
else
{
if (root->_val > val) add(root->_left, val);
else add(root->_right, val);
}
}
};
// 测试主函数
int main()
{
// 建立搜索树
BSTree tree;
tree.add(10);
tree.add(8);
tree.add(123);
tree.add(11);
tree.add(900);
// 输出中序遍历序列
tree.midOrder();
// 做完镜像后再输出中序遍历序列
tree.mirror();
tree.midOrder();
system("pause");
}
代码下载及其运行
代码下载地址:http://download.youkuaiyun.com/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果