编程练习——二叉树(BinaryTree)

先写一个树节点类。使用Temple也可以,不使用的话,使用特定类型,用法比较局限。不过本着“今天尽量不要做出今天不必要的决定”极限编程法制。做一个特殊类型的BinaryTree,也未尝不可。

这里的TreeNode只有数据域。

 

  1. template<class T>
  2. class TreeNode
  3. {
  4. private:
  5.  T data;
  6.  TreeNode<T> * left;
  7.  TreeNode<T> * right;
  8. public:
  9.  TreeNode(T& data)
  10.  {
  11.   this->data = data;
  12.   this->left = NULL;
  13.   this->right = NULL;
  14.  }
  15.  TreeNode(T& data,TreeNode<T>* left, TreeNode<T>* right)
  16.  {
  17.   this->data = data;
  18.   this->left = left;
  19.   this->right = right;
  20.  }
  21.  ~TreeNode()
  22.  {
  23.   this->left = NULL;
  24.   this->right = NULL;
  25.   cout << "node ("<<this->data<<") destory!"<<endl;
  26.   // to do
  27.  }
  28.  T getData()
  29.  {
  30.   return data;
  31.  }
  32.  void setData(T& data)
  33.  {
  34.   this->data = data;
  35.  }
  36.  TreeNode<T> * getLeft()
  37.  {
  38.   return left;
  39.  }
  40.  void setLeft(TreeNode<T> * left)
  41.  {
  42.   this->left = left;
  43.  }
  44.  TreeNode<T> * getRight()
  45.  {
  46.   return right;
  47.  }
  48.  void setRight(TreeNode<T>* right)
  49.  {
  50.   this->right = right;
  51.  }
  52. };

下面是BinaryTree的实现。一般来说,一个BinaryTree最重要的函数就是构造和析构。基本的函数是遍历。

下面的类只实现了中序遍历,和树形打印。析构删除节点使用的是后序删除法。

  1. template<class T>
  2. class BinaryTree
  3. {
  4. protected:
  5.  TreeNode<T>* head;
  6.  void clearSubTree(TreeNode<T>* node)
  7.  {
  8.   if(node != NULL)
  9.   {
  10.    clearSubTree(node->getLeft());
  11.    clearSubTree(node->getRight());
  12.    delete node;
  13.   }
  14.  }
  15.  void printTree(TreeNode<T>* subTree, int count)
  16.  {
  17.   if(subTree!=NULL)
  18.   {
  19.    
  20.    printTree(subTree->getRight(), count+1);
  21.    for(int i = 0; i < count; i++)
  22.    {
  23.     cout << " ";
  24.    }
  25.    cout <<subTree->getData()<<endl;
  26.    printTree(subTree->getLeft(),count+1);
  27.   }
  28.  }
  29.  void printInMidOrder(TreeNode<T>* subTree)
  30.  {
  31.   if(subTree!=NULL)
  32.   {
  33.    printInMidOrder(subTree->getLeft());
  34.    
  35.    cout <<subTree->getData()<<endl;
  36.    printInMidOrder(subTree->getRight());
  37.   }
  38.  }
  39. public:
  40.  BinaryTree(T& data)
  41.  {
  42.   head = new TreeNode<T>(data);
  43.  }
  44.  BinaryTree(TreeNode<T>* head)
  45.  {
  46.   this->head = head;
  47.  }
  48.  ~BinaryTree()
  49.  {
  50.   clearSubTree(head);
  51.  }
  52.  void printTree()
  53.  {
  54.   printTree(this->head,0);
  55.  }
  56.  void printInMidOrder()
  57.  {
  58.   printInMidOrder(this->head);
  59.  }
  60. };

如果BinaryTree中还有插入删除操作就好了。但是如何插入,如何删除必须按照一定的规则进行。所以就有后面的二叉查找树、AVLTree、SplayTree、RedBlackTree等各种类型的二叉树。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值