编程练习——二叉树(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
    评论
您可以使用以下方法来实现输出所有二叉树直径及其路径长度的功能: ```java import java.util.ArrayList; import java.util.List; public class BinaryTree<T> { private Node<T> root; // 其他方法省略... public static <T> void diameterAll(BinaryTree<T> bitree) { if (bitree.root == null) { System.out.println("二叉树为空!"); return; } List<Node<T>> path = new ArrayList<>(); int[] diameter = new int[1]; diameterAllHelper(bitree.root, path, diameter); System.out.println("直径:"); for (int i = 0; i < path.size(); i++) { Node<T> node = path.get(i); System.out.print(node.data + " "); if (i < path.size() - 1) { System.out.print("-> "); } } System.out.println(); System.out.println("路径长度:" + diameter[0]); } private static <T> int diameterAllHelper(Node<T> node, List<Node<T>> path, int[] diameter) { if (node == null) { return 0; } int leftHeight = diameterAllHelper(node.left, path, diameter); int rightHeight = diameterAllHelper(node.right, path, diameter); int currentDiameter = leftHeight + rightHeight + 1; if (currentDiameter > diameter[0]) { diameter[0] = currentDiameter; path.clear(); addPath(node.left, path); path.add(node); addPath(node.right, path); } return Math.max(leftHeight, rightHeight) + 1; } private static <T> void addPath(Node<T> node, List<Node<T>> path) { if (node == null) { return; } addPath(node.left, path); path.add(node); addPath(node.right, path); } private static class Node<T> { private T data; private Node<T> left; private Node<T> right; public Node(T data) { this.data = data; } } } ``` 您可以将上述代码保存为`BinaryTree.java`文件,并在您的程序中使用`BinaryTree.diameterAll(bitree)`来输出所有二叉树直径及其路径长度。请注意,上述代码假设您已经实现了其他必要的二叉树操作方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值