您的位置:首页 > 编程语言

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

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

这里的TreeNode只有数据域。

 

template<class T>

class TreeNode

{

private:

 T data;

 TreeNode<T> * left;

 TreeNode<T> * right;

public:

 TreeNode(T& data)

 {

  this->data = data;

  this->left = NULL;

  this->right = NULL;

 }

 TreeNode(T& data,TreeNode<T>* left, TreeNode<T>* right)

 {

  this->data = data;

  this->left = left;

  this->right = right;

 }

 ~TreeNode()

 {

  this->left = NULL;

  this->right = NULL;

  cout << "node ("<<this->data<<") destory!"<<endl;

  // to do

 }

 T getData()

 {

  return data;

 }

 void setData(T& data)

 {

  this->data = data;

 }

 TreeNode<T> * getLeft()

 {

  return left;

 }

 void setLeft(TreeNode<T> * left)

 {

  this->left = left;

 }

 TreeNode<T> * getRight()

 {

  return right;

 }

 void setRight(TreeNode<T>* right)

 {

  this->right = right;

 }

};

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

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

template<class T>

class BinaryTree

{

protected:

 TreeNode<T>* head;

 void clearSubTree(TreeNode<T>* node)

 {

  if(node != NULL)

  {

   clearSubTree(node->getLeft());

   clearSubTree(node->getRight());

   delete node;

  }

 }

 void printTree(TreeNode<T>* subTree, int count)

 {

  if(subTree!=NULL)

  {

   

   printTree(subTree->getRight(), count+1);

   for(int i = 0; i < count; i++)

   {

    cout << " ";

   }

   cout <<subTree->getData()<<endl;

   printTree(subTree->getLeft(),count+1);

  }

 }

 void printInMidOrder(TreeNode<T>* subTree)

 {

  if(subTree!=NULL)

  {

   printInMidOrder(subTree->getLeft());

   

   cout <<subTree->getData()<<endl;

   printInMidOrder(subTree->getRight());

  }

 }

public:

 BinaryTree(T& data)

 {

  head = new TreeNode<T>(data);

 }

 BinaryTree(TreeNode<T>* head)

 {

  this->head = head;

 }

 ~BinaryTree()

 {

  clearSubTree(head);

 }

 void printTree()

 {

  printTree(this->head,0);

 }

 void printInMidOrder()

 {

  printInMidOrder(this->head);

 }

};

如果BinaryTree中还有插入删除操作就好了。但是如何插入,如何删除必须按照一定的规则进行。所以就有后面的二叉查找树、AVLTree、SplayTree、RedBlackTree等各种类型的二叉树。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  编程 null
相关文章推荐