链表队列与二叉树基本操作

原创 2007年09月25日 00:00:00

/*********************************
 * file : m.cpp
 * 功能: 1,建链表队列
         2,定义二叉树
   3,对二叉树进行中序,后序遍历
   4,对二叉树进行层次遍历
   5,计算二叉树的叶子数目
   6,计算二叉树的深度
   7,实现复制二叉树
   8,删除二叉树
 * 创建日期:2007-9-24
*********************************/

#include <iostream>
using namespace std;

template <typename T>
class qnode
{
public:
 qnode()
 {
  next = 0;
 }
 qnode(const T &v):value(v)
 {
  next = 0;
 }

public:
 T value;
 qnode<T> *next;
};

template <typename T>
class Quen
{
public:
 qnode<T> *front;
 qnode<T> *rear;

public:
 Quen():front(0),rear(0)
 {}
 Quen(const T &v)
 {
  qnode<T> *p = new qnode<T>(v);
  front = p;
  rear = p;
 }

 void push(const T &v)
 {
  qnode<T> *p = new qnode<T>(v);
  rear->next = p;
  rear = p;
 }
 
 void pop()
 {
  if(empty() == false)
  {
   qnode<T> *p = front;
   front = front->next;
   delete p;
  }
  else
   cout << "Queen empty!" << endl;
 }

 bool empty()
 {
  return !((front != 0) && (rear != 0));
 }

 T getfront()
 {
  return front->value;
 }
};

// 以上为链表队列的实现
// 以下为二叉树的遍历操作

template <typename T>
class tnode
{
public:
 tnode():left(0), right(0)
 {}
 tnode(const T &v, tnode<T> *lef =  0, tnode<T> *rig = 0):value(v),left(lef),right(rig)
 {}

public:
 T value;
 tnode<T> *left;
 tnode<T> *right;
};

//中序遍历
template <typename T>
void InOrder(tnode<T> *root)
{
 if( root != 0)
 {
  InOrder(root->left);
  cout << root->value << ' ';
  InOrder(root->right);
 }
}

// 后序遍历
template <typename T>
void PostOrder(tnode<T> *root)
{
 if( root != 0)
 {
  PostOrder(root->left);
  PostOrder(root->right);
  cout << root->value << ' ';
 }
}

// 借助链表队列实现迭代层次遍历
template <typename T>
void level(tnode<T> *root)
{
 Quen<tnode<T> *> *q = new Quen<tnode<T> *>(root);
 tnode<T> *p;

// q->push(root);
 while(q->empty() == false)
 {
  p = q->getfront();
  cout << p->value << ' ';
  if( p->left != 0 )
   q->push(p->left);
  if( p->right != 0 )
   q->push(p->right);
  q->pop();
 }
}

// 计算叶子数目
template <typename T>
void countleaf(tnode<T> *root, int &count)
{
 if( root != 0 )
 {
  if( (root->left == 0) && (root->right == 0))
   count++;

  countleaf(root->left, count);
  countleaf(root->right, count);
 }
}

// 计算树高度
template <typename T>
int depth(tnode<T> *root)
{
 int ldepth, rdepth, ndepth;
 if( root->left == 0 )
  ldepth = -1;
 else
  ldepth = depth(root->left);

 if( root->right == 0 )
  rdepth = -1;
 else
  rdepth = depth(root->right);

 ndepth = 1 + ((ldepth > rdepth) ? ldepth : rdepth);

 return ndepth;
}

// 复制二叉树
template <typename T>
tnode<T> *copytree( tnode<T> *root )
{
 tnode<T> *lp, *rp, *np;
 if( root == 0 )
  return 0;
 lp = copytree( root->left );
 rp = copytree( root->right );
 np = new tnode<T>(root->value, lp, rp);

 return np;
}

// 删除二叉树
template <typename T>
void deltree(tnode<T> *root)
{
 if( root != 0 )
 {
  deltree(root->left);
  deltree(root->right);
  delete root;
 }
}

int main()
{
 tnode<int> *p, *root;
 
 root = new tnode<int>(1);
 root = new tnode<int>(11, 0, root);
 p = new tnode<int>(4);
 root->left = p;
 p = new tnode<int>(2);
 p = new tnode<int>(6, 0, p);
 root = new tnode<int>(5, p, root);

 InOrder(root);
 cout << endl;

 PostOrder(root);
 cout << endl;

 level(root);
 cout << endl;

 int count = 0;
 countleaf(root, count);
 cout << "count = " << count << endl;

 cout << "depth = " << depth(root) << endl;

 level(copytree(root));
 cout << endl;
 
 //deltree(root);
// level(root);
 cout << endl;

 return 0;

 

输出:

6 2 5 4 11 1
2 6 4 1 11 5
5 6 11 2 4 1
count = 3
depth = 2
5 6 11 2 4 1

【数据结构】数组、链表、栈、队列、二叉树

数组 数组存储的数据在地址空间上是连续的。 方便数据的查找,查找数据的时间复杂度为O(1)。...
  • m0_37854317
  • m0_37854317
  • 2017年04月23日 10:50
  • 825

数据结构(栈,队列,链表,二叉树)

栈栈作为一种数据结构,用途十分广泛。在回调函数等许多场景中都有应用。我们需要了解它的基本用途,那就是先进后出和队列的先进先出正好相反。最近在学习数据结构和算法,于是自己来实现。我特别喜欢C语言的指针,...
  • u013766436
  • u013766436
  • 2016年05月04日 17:03
  • 1929

面试笔试问题总结(五)—数组、链表、二叉树

作者:disappearedgod 文章出处:http://blog.csdn.net/disappearedgod/article/details/38928535 时间:2014-8-29...
  • disappearedgod
  • disappearedgod
  • 2014年08月30日 13:10
  • 985

三叉链表实现二叉树

VS2005可以运行通过。程序参考了许多大牛的总结,因能力有限,如有问题,请各位大牛指正。 二叉树采用三叉链表,实现了二叉树的构造、遍历、深度、宽度、结点个数、叶子个数 以及 结点的交换、层次、祖先...
  • insistGoGo
  • insistGoGo
  • 2011年08月16日 00:17
  • 4349

数组、链表、堆栈、队列和树

数据结构:是指相互之间存在一种或多种特定关系的数据元素的集合。听起来是不是很抽象,简单理解:数据结构就是描述对象间逻辑关系的学科。比如:队列就是一种先进先出的逻辑结构,栈是一种先进后出的逻辑结构,家谱...
  • wei78008023
  • wei78008023
  • 2016年02月25日 10:04
  • 2945

使用C++链表来实现二叉树的存储和基本操作

1、创建Node.h 定义链表的节点 #ifndef NODE_H #define NODE_H class Node{ public: Node(); Node* searchNo...
  • liuweiyuxiang
  • liuweiyuxiang
  • 2016年10月07日 23:07
  • 1712

c++学习笔记—二叉树基本操作的实现

用c++语言实现的二叉树基本操作,包括二叉树的创建、二叉树的遍历(包括前序、中序、后序递归和非递归算法)、求二叉树高度,计数叶子节点数、计数度为1的节点数等基本操作。 IDE:vs2013 具体实...
  • xujian_2014
  • xujian_2014
  • 2015年01月15日 17:05
  • 1445

数据结构与实现——数组、矩阵、链表、队列、栈、对象、二叉树和红黑树

1\、栈
  • lhkaikai
  • lhkaikai
  • 2014年04月28日 23:10
  • 2123

链表和二叉树

3. 链表 ~~~~~~~ 1) 基本特征:内存中不连续的节点序列,节点之间通过next指针彼此相连;                          每个节点的next指针都指向下一个节点,最...
  • qq_28090573
  • qq_28090573
  • 2016年04月26日 13:55
  • 817

Java中队列的实现(2)-使用单向链表以及实现

队列(Queue):是另一种被限制过的线性表,它是固定一端来插入数据元素,另一端只删除元素,也就是说队列中的元素移动是固定的,就像超市收银台一样,一边是进的,一边是出的,而且是先进入的首先获得服务的。...
  • daguairen
  • daguairen
  • 2016年10月06日 19:50
  • 1188
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:链表队列与二叉树基本操作
举报原因:
原因补充:

(最多只允许输入30个字)