Chinaunix首页 | 论坛 | 博客
  • 博客访问: 352267
  • 博文数量: 159
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 182
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-02 10:42
文章分类

全部博文(159)

文章存档

2015年(18)

2014年(132)

2013年(9)

分类: C/C++

2013-12-18 22:36:13


点击(此处)折叠或打开

  1. #include <iostream>
  2. using namespace std;
  3.   
  4. // 树节点,包括左二子、右儿子指针和保存的值
  5. class TreeNode
  6. {
  7. public:
  8.     TreeNode* _left;
  9.     TreeNode* _right;
  10.     int _val;
  11.   
  12.     TreeNode(int val, TreeNode* left = NULL, TreeNode* right = NULL) :
  13.         _val(val), _left(left), _right(right){}
  14. };
  15.   
  16. // 二叉树类
  17. class BSTree
  18. {
  19. public:
  20.     TreeNode* _root;
  21.   
  22.     BSTree(TreeNode* root = NULL) : _root(root) {}
  23.   
  24.     // 往树里增加元素
  25.     void add(int val)
  26.     {
  27.         add(_root, val);
  28.     }
  29.   
  30.     // 中序遍历并打印输出
  31.     void midOrder()
  32.     {
  33.         cout << "中序遍历输出序列:";
  34.         midOrder(_root);
  35.         cout << endl;
  36.     }
  37.   
  38.     // 做镜像
  39.     void mirror()
  40.     {
  41.         mirror(_root);
  42.     }
  43.   
  44. private:
  45.     // 镜像,使用递归进行镜像,具体的做法为交换左右儿子,然后递归的对左右子树做镜像
  46.     void mirror(TreeNode* root)
  47.     {
  48.         if (root == NULL) return;
  49.   
  50.         TreeNode* tmp = root->_left;
  51.         root->_left = root->_right;
  52.         root->_right = tmp;
  53.   
  54.         mirror(root->_left);
  55.         mirror(root->_right);
  56.     }
  57.   
  58.     // 中序遍历并打印序列,也用了递归
  59.     void midOrder(TreeNode* root)
  60.     {
  61.         if (root == NULL) return;
  62.   
  63.         midOrder(root->_left);
  64.         cout << root->_val << " ";
  65.         midOrder(root->_right);
  66.     }
  67.   
  68.     // 使用递归比较简单
  69.     void add(TreeNode*& root, int val)
  70.     {
  71.         // 如果比根节点大,则添加到右子树,否则添加到左子树
  72.         if (root == NULL) root = new TreeNode(val);
  73.         else
  74.         {
  75.             if (root->_val > val) add(root->_left, val);
  76.             else add(root->_right, val);
  77.         }
  78.     }
  79. };
  80.   
  81. // 测试主函数
  82. int main()
  83. {
  84.     // 建立搜索树
  85.     BSTree tree;
  86.     tree.add(10);
  87.     tree.add(8);
  88.     tree.add(123);
  89.     tree.add(11);
  90.     tree.add(900);
  91.   
  92.     // 输出中序遍历序列
  93.     tree.midOrder();
  94.   
  95.     // 做完镜像后再输出中序遍历序列
  96.     tree.mirror();
  97.     tree.midOrder();
  98.   
  99.     system("pause");
  100. }

阅读(1195) | 评论(0) | 转发(0) |
0

上一篇:银行家算法

下一篇:和最大的子矩阵

给主人留下些什么吧!~~