二叉树(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
相关文章
|
5月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
3月前
|
Python
【Leetcode刷题Python】114. 二叉树展开为链表
LeetCode上114号问题"二叉树展开为链表"的Python实现,通过先序遍历二叉树并调整节点的左右指针,将二叉树转换为先序遍历顺序的单链表。
27 3
【Leetcode刷题Python】114. 二叉树展开为链表
|
3月前
|
存储 Java
|
6月前
|
数据采集 Java 数据处理
Java流与链表:探索java.util.stream与LinkedList的交汇点
本文探讨了Java中流(Streams)与链表(LinkedList)的结合使用,展示了如何通过流处理LinkedList以实现高效数据操作。示例代码包括LinkedList的基本操作、使用Stream进行过滤和映射,以及结合HttpClient和代理IP实现网络爬虫。代理IP有助于绕过反爬机制,提高爬取效率。通过结合这些技术,开发者能编写出更简洁、高效的代码。
Java流与链表:探索java.util.stream与LinkedList的交汇点
|
5月前
Qt控件(按钮、单选、复选、list、tree、table)
Qt控件(按钮、单选、复选、list、tree、table)
|
5月前
|
存储 算法
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
63 0
数据结构和算法学习记录——二叉树的存储结构&二叉树的递归遍历(顺序存储结构、链表存储结构、先序中序后序递归遍历)
|
6月前
|
算法 测试技术
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向循环链表
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向循环链表
|
6月前
|
存储 算法 Java
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向链表
【数据结构与算法 | 基础篇】模拟LinkedList实现的双向链表
|
6月前
|
算法
【数据结构与算法 | 基础篇】模拟LinkedList实现的链表(无哨兵)
【数据结构与算法 | 基础篇】模拟LinkedList实现的链表(无哨兵)
|
5月前
|
C++ 容器
【C++进阶】深入STL之list:高效双向链表的使用技巧
【C++进阶】深入STL之list:高效双向链表的使用技巧
59 0