二叉树(Binary Tree)的二叉链表(Binary Linked List)实现

简介: 二叉树(Binary Tree)的二叉链表(Binary Linked List)实现

BinaryNode.h

#ifndef __BINARYNODE_H__
#define __BINARYNODE_H__
template <class T>
class BinaryNode
{
public:
  T data;
  BinaryNode<T> *lchild, *rchild;
};
#endif


BinaryTree.h

#ifndef __BINARYTREE_H__
#define __BINARYTREE_H__
#include "BinaryNode.h"
template <class T>
class BinaryTree
{
public:
  BinaryTree();
  ~BinaryTree();
public:
  void PreOrder();
  void InOrder();
  void PostOrder();
  void LeverOrder();
private:
  static int count;
  BinaryNode<T> *root;
  BinaryNode<T> *Creat(BinaryNode<T> *_binarytree);
private:
  void PreOrder(BinaryNode<T> *_binarytree);
  void InOrder(BinaryNode<T> *_binarytree);
  void PostOrder(BinaryNode<T> *_binarytree);
  void Release(BinaryNode<T> *_binarytree);
};
#endif


BinaryTree.cpp

#include "BinaryTree.h"
#include <iostream>
using namespace std;
template <class T>
int BinaryTree<T>::count = 0;
template <class T>
BinaryTree<T>::BinaryTree()
{root = Creat(root);}
template <class T>
BinaryTree<T>::~BinaryTree()
{Release(root);}
template <class T>
void BinaryTree<T>::PreOrder()
{PreOrder(root);}
template <class T>
void BinaryTree<T>::InOrder()
{InOrder(root);}
template <class T>
void BinaryTree<T>::PostOrder()
{PostOrder(root);}
template <class T>
void BinaryTree<T>::LeverOrder()
{
  int front = -1, rear = -1;
  BinaryNode<T> *tempNode;
  BinaryNode<T> **queue = new BinaryNode<T> *[count];
  queue[++rear] = root;
  while (front != rear)
  {
  tempNode = queue[++front];
  cout << tempNode->data << "\t";
  if (tempNode->lchild != nullptr)
    queue[++rear] = tempNode->lchild;
  if (tempNode->rchild != nullptr)
    queue[++rear] = tempNode->rchild;
  }
}
template <class T>
BinaryNode<T> *BinaryTree<T>::Creat(BinaryNode<T> *_binarytree)
{
  char ch;
  cin >> ch;
  if (ch == '#')
  _binarytree = nullptr;
  else
  {
  _binarytree = new BinaryNode<T>;
  _binarytree->data = ch;
  _binarytree->lchild = Creat(_binarytree->lchild);
  _binarytree->rchild = Creat(_binarytree->rchild);
  }
  count += 1;
  return _binarytree;
}
template <class T>
void BinaryTree<T>::PreOrder(BinaryNode<T> *_binarytree)
{
  if (_binarytree == nullptr)
  return;
  else
  {
  cout << _binarytree->data << "\t";
  PreOrder(_binarytree->lchild);
  PreOrder(_binarytree->rchild);
  }
}
template <class T>
void BinaryTree<T>::InOrder(BinaryNode<T> *_binarytree)
{
  if (_binarytree == nullptr)
  return;
  else
  {
  InOrder(_binarytree->lchild);
  cout << _binarytree->data << "\t";
  InOrder(_binarytree->rchild);
  }
}
template <class T>
void BinaryTree<T>::PostOrder(BinaryNode<T> *_binarytree)
{
  if (_binarytree == nullptr)
  return;
  else
  {
  PostOrder(_binarytree->lchild);
  PostOrder(_binarytree->rchild);
  cout << _binarytree->data << "\t";
  }
}
template <class T>
void BinaryTree<T>::Release(BinaryNode<T> *_binarytree)
{
  if (_binarytree != nullptr)
  {
  Release(_binarytree->lchild);
  Release(_binarytree->rchild);
  delete _binarytree;
  }
}


tree.cpp

#include <iostream>
#include "BinaryTree.h"
#include "BinaryTree.cpp"
using namespace std;
int main()
{
  BinaryTree<char> *bt = new BinaryTree<char>;
  cout << "LeverOrder: \t";
  bt->LeverOrder();
  cout << endl;
  cout << "PreOrder: \t";
  bt->PreOrder();
  cout << endl;
  cout << "InOrder: \t";
  bt->InOrder();
  cout << endl;
  cout << "PostOrder: \t";
  bt->PostOrder();
  cout << endl;
  return 0;
}


//要形成树(#号代表空节点):
                    A                               A
                  /   \                           /   \
                 B     C          ====>          B     C
                  \                             / \   / \
                   D                           #   D #   #
                                                  / \
                                                 #   #
// 输入(#号代表空节点):
A
B
#
D
#
#
C
#
#
// 输出
LeverOrder:     A       B       C       D
PreOrder:       A       B       D       C
InOrder:        B       D       A       C
PostOrder:      D       B       C       A
相关文章
|
4月前
|
Java
LinkedList与链表(有源码剖析)(一)
LinkedList与链表(有源码剖析)
38 0
|
2月前
|
设计模式 测试技术
在实现链表的代码中,为什么要使用`Node`类而不是直接在`LinkedList`类中定义节点?
在实现链表的代码中,为什么要使用`Node`类而不是直接在`LinkedList`类中定义节点?
21 1
|
7月前
|
存储 安全 Java
【JavaSE专栏49】Java集合类LinkedList解析,链表和顺序表有什么不同?
【JavaSE专栏49】Java集合类LinkedList解析,链表和顺序表有什么不同?
|
2月前
|
算法 Java 索引
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
【数据结构与算法】4、双向链表(学习 jdk 的 LinkedList 部分源码)
34 0
|
2月前
|
存储 算法 Java
【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)
【数据结构与算法】2、链表(简单模拟 Java 中的 LinkedList 集合,反转链表面试题)
43 0
|
3月前
|
存储
数据结构 模拟实现LinkedList双向不循环链表
数据结构 模拟实现LinkedList双向不循环链表
57 1
|
3月前
|
存储
数据结构 模拟实现LinkedList单向不循环链表
数据结构 模拟实现LinkedList单向不循环链表
34 0
|
4月前
|
算法 Python Java
Java每日一练(20230429) 二叉树后序遍历、删除无效括号、合并有序链表
Java每日一练(20230429) 二叉树后序遍历、删除无效括号、合并有序链表
29 0
Java每日一练(20230429) 二叉树后序遍历、删除无效括号、合并有序链表
|
4月前
|
算法 Java C++
Java每日一练(20230424) 二叉树中序遍历、交换链表节点、不同子序列
Java每日一练(20230424) 二叉树中序遍历、交换链表节点、不同子序列
36 0
Java每日一练(20230424) 二叉树中序遍历、交换链表节点、不同子序列
|
4月前
|
算法 C++ Python
Python每日一练(20230423) 链表倒数结点、最小子串、二叉树层序遍历
Python每日一练(20230423) 链表倒数结点、最小子串、二叉树层序遍历
27 0
Python每日一练(20230423) 链表倒数结点、最小子串、二叉树层序遍历