数据结构之树_Tree

来源:互联网 发布:java定义二维数组 编辑:程序博客网 时间:2024/05/20 12:24
#ifndef TREE_H_INCLUDED
#define TREE_H_INCLUDED
#include<iostream>
#include <queue>
#include<stack>
template <class T>
class TreeNode//树的节点
{
private:
 T data;
 TreeNode<T> *firstChild, *nextBrother;//左孩子和右兄弟
public:
 TreeNode<T>(T value = 0, TreeNode<T>* L = NULL, TreeNode<T>* R = NULL) :
  data(value), firstChild(L), nextBrother(R){}
 T& GetData(){ return data; }
 TreeNode<T>* & GetFirstChild(){ return firstChild; }
 TreeNode<T>* & GetNextBrother(){ return nextBrother; }

};

template<class T>
class Tree
{
private:
 TreeNode<T>* root;
 T stop;
public:
 Tree(T tostop='#') :root(NULL), stop(tostop){}
 ~Tree(){ DeleTree(root); }
 TreeNode<T>* CreatTree();//创建树
 void PreOrder(TreeNode<T>* t);//先根遍历
 void PostOrder(TreeNode<T>* t);//后跟遍历
 void LevelOrder(TreeNode<T>* t);//层次遍历
 void NorePreOrder(TreeNode<T>* t);//先根遍历迭代算法
 void NorePostOrder(TreeNode<T>* t);//后跟遍历迭代算法
 TreeNode<T>* FindFather(const TreeNode<T>* p, TreeNode<T>* t);//查找父结点
 TreeNode<T>* FindData(const T& item, TreeNode<T>* t);//查找值所在的结点
 TreeNode<T>* GetRoot(){ return root; }
 void DeleTree(TreeNode<T>* t);
 //     TreeNode<T>* FirstChild(TreeNode<T>* t);//t结点的大孩子
 //     TreeNode<T>* NextBrother(TreeNode<T>* t);//t结点的大兄弟
};

//先跟序列构造树
template <class T>
TreeNode<T>* Tree<T>::CreatTree()
{
 TreeNode<T>* newRoot;
 T item;
 cout << "请输入树的一个结点:";
 cin >> item;
 if (item == stop)
 {
  newRoot = NULL;
 }
 else
 {
  newRoot = new TreeNode<T>(item);
  newRoot->GetFirstChild() = CreatTree();
  newRoot->GetNextBrother() = CreatTree();
 }
 root = newRoot;
 return newRoot;
}

//先跟遍历
template <class T>
void Tree<T>::PreOrder(TreeNode<T>* t)
{
 if (t != NULL)
 {
  cout << t->GetData();
  PreOrder(t->GetFirstChild());
  PreOrder(t->GetNextBrother());
 }

/* 
 if(t!=NULL)
 {
 cout<<t->GetData();
 TreeNode<T>* child=NULL;
 child=FirstChild(t);
 while(child)
 {
 PreOrder(child);
 child=NextBrother(child);
 }
 }
*/
}

//先根遍历,迭代算法
template<class T>
void Tree<T>::NorePreOrder(TreeNode<T>* t)
{
 if (t == NULL)
  return;
 std::stack<TreeNode<T>*> treeStack;
 TreeNode<T>* p = t;
 do
 {
  while (p != NULL)
  {
   cout << p->GetData();
   treeStack.push(p);
   p = p->GetFirstChild();
  }
  while (p == NULL&&!treeStack.empty())
  {
   p = treeStack.top();
   treeStack.pop();
   p = p->GetNextBrother();

  }
 } while (!treeStack.empty());

}

//后跟遍历
template <class T>
void Tree<T>::PostOrder(TreeNode<T>* t)
{
 if (t != NULL)
 {
  PostOrder(t->GetFirstChild());
  cout << t->GetData();
  PostOrder(t->GetNextBrother());
 }
}

//后根遍历迭代算法
template <class T>
void Tree<T>::NorePostOrder(TreeNode<T>* t)
{
 if (t == NULL)
  return;
 std::stack<TreeNode<T>*> treeStack;
 TreeNode<T>* p = t;
 do
 {
  while (p != NULL)
  {

   treeStack.push(p);
   p = p->GetFirstChild();
  }
  while (p == NULL&&!treeStack.empty())
  {
   p = treeStack.top();
   treeStack.pop();
   cout << p->GetData();
   p = p->GetNextBrother();

  }
 } while (!treeStack.empty());
}

//层次遍历
template <class T>
void Tree<T>::LevelOrder(TreeNode<T>* t)
{
 std::queue<TreeNode<T>*> treeQueue;
 if (t != NULL)
 {
  TreeNode<T>* p;
  treeQueue.push(t);
  while (!treeQueue.empty())
  {
   p = treeQueue.front();
   cout << p->GetData();
   treeQueue.pop();
   p = p->GetFirstChild();
   while (p != NULL)//一层一层的遍历
   {
    treeQueue.push(p);//先看大孩子
    p = p->GetNextBrother();//再看大兄弟
   }

  }

 }
}

//查找父结点
template <class T>
TreeNode<T>* Tree<T>::FindFather(const TreeNode<T>* p, TreeNode<T>* t)
{
 if (t == NULL)
  return NULL;
 if (t->GetFirstChild() == p)
  return t;
 TreeNode<T>* q;
 TreeNode<T>* result;
 q = t->GetFirstChild();//从第一棵子树开始
 while (q != NULL&&q != p)
 {
  result = FindFather(p, q);//若找到,则返回,若未找到,则下一棵子树
  if (result == NULL)
   q = q->GetNextBrother();
  else
   return result;
 }
 if (q == p)//若q是t的一个子节点,则将t返回
  return t;
 else
  return NULL;
}

//查找值结点
template <class T>
TreeNode<T>* Tree<T>::FindData(const T& item, TreeNode<T>* t)
{
 if (t == NULL)
  return NULL;
 if (t->GetData() == item)
  return t;
 else
 {
  TreeNode<T>* p = t->GetFirstChild();
  TreeNode<T>* result = NULL;
  while (p != NULL && (result = FindData(item, p)) != NULL)
   p = p->GetNextBrother();
  return result;

 }

}

template <class T>
void Tree<T>::DeleTree(TreeNode<T>* t)
{
 if (t != NULL)
 {
  TreeNode<T>* p = t->GetFirstChild(), *next;
  while (p != NULL)
  {
   next = p->GetNextBrother();
   DeleTree(p);
   p = next;
  }
  delete p;
 }
}


#endif
0 0
原创粉丝点击