读书人

树的建立、深度及途径

发布时间: 2012-09-01 09:33:03 作者: rapoo

树的建立、深度及路径

#include <cstdlib>
#include <iostream>
#include "Tree.h"
#include "Stack.h"
using namespace std;


int main()
{
??? Tree<char> tree;
??? cout << "Enter each Nodes two ones a time, which are SuperNode and SubNode : "<<endl;

??? tree.CreatTree();
???
??? int height=tree.getHeight();
???
??? cout << "The height of this tree is "<<height<<endl;
???
??? cout<<endl;???
??? cout << "Each path in this tree is as following :"<<endl;
???
??? tree.getAllpath();
???
???
??? system("PAUSE");
???
??? return 0;
}

?

?

#include <iostream>
#include"Queue.h"
#include"Stack.h"
#ifndef TREE_H
#define TREE_H

using namespace std;


template<typename T>
class TreeNode
{
public:
? T element;
? TreeNode<T> * firstchild;
? TreeNode<T> * nextsibling;

? TreeNode()
? {
??? firstchild = NULL;
??? nextsibling = NULL;
? }

? TreeNode(T element)
? {
??? this->element = element;
??? firstchild = NULL;
??? nextsibling = NULL;
? }
};
template < typename T >
?class Tree
?{
?public:
? Tree();
? int getSize();
? int getHeight();
? void CreatTree();
? void getAllpath();
??
?private:
? TreeNode<T> * root;
? Queue<TreeNode<T>*> queue;
? Stack<char> stack;
? int size;
? int Height(TreeNode<T> *root);
? void Allpath(TreeNode<T> *root);
};

template < typename T >
Tree<T>::Tree()
{
? root=new TreeNode<T>();
}

template < typename T >
void Tree<T>::CreatTree()
{
? char fa,ch;
? cin>>fa;
? cin>>ch;
?
? TreeNode<T> *r;
? TreeNode<T> *p;
? for( ; ch!='#' ; ){
?? p =new TreeNode<T>(ch);
?? queue.enqueue(p);
?? if(fa=='@')? root=p;
??? else
??? {
????? TreeNode<T>*treenode=queue.getHead();
???????? while(treenode->element!=fa){
????????????? queue.dequeue();
????????????? treenode=queue.getHead();
???????? };
???????
??????? if(!(treenode->firstchild))
??????? {treenode->firstchild=p;
???????? r=p;
???????? size++;
????????
??????? }
??????? else
??????? {r->nextsibling=p;
???????? r=p;
???????? size++;
???????
??????? }
??? }
??? cin>>fa;cin>>ch;
? }
}

template < typename T >
int Tree<T>::getHeight()
{
? return Height(root);
}

template < typename T >
int Tree<T>::Height(TreeNode<T> *root)
{
? if(!root) return 0;
? else{
?????? int h1=Height(root->firstchild);
?????? int h2=Height(root->nextsibling);
?????? if(h2>(h1+1))
??????????? return h2;
?????? else return h1+1;
????? }
}

template < typename T >
void Tree<T>::getAllpath()
{
? Allpath(root);
}

template < typename T >
void Tree<T>::Allpath(TreeNode<T> *r)
{
? while(r){
?????????? stack.push(r->element);
?????????? if(!r->firstchild)
????????????? stack.print();
?????????? else Allpath(r->firstchild);
?????????? char del=stack.pop();
?????????? r=r->nextsibling;
? }
}

#endif

?

#ifndef QUEUE_H
#define QUEUE_H
#include <stdexcept>
using namespace std;

template<typename T>
class Node
{
public:
? T element;? // Element contained in the node
? Node<T> *next; // Pointer to the next node

? Node() // No-arg constructor
? {
??? next = NULL;
? }

? Node(T element) // Constructor
? {
??? this->element = element;
??? next = NULL;
? }
};

template<typename T>
class Queue
{
public:
? Queue();
? void enqueue(T element);
? T dequeue() throw (runtime_error);
? int getSize();
? T getHead();
?
private:
?Node<T> *head, *tail;
? int size;
};

template<typename T>
Queue<T>::Queue()
{
? head = tail = NULL;
? size = 0;
}

template<typename T>
void Queue<T>::enqueue(T element)
{
?? if (tail == NULL)
? {
??? head = tail = new Node<T>(element);
? }
? else
? {
??? tail->next = new Node<T>(element);
??? tail = tail->next;
? }

? size++;
}

template<typename T>
T Queue<T>::dequeue() throw (runtime_error)
{
?? if (size == 0)
?? throw runtime_error("No elements in the list");
? else
? {
??? Node<T> *temp = head;
??? head = head->next;
??? size--;
??? if (head == NULL) tail = NULL;
??? T element = temp->element;
??? delete temp;
??? return element;
? }
}

template<typename T>
int Queue<T>::getSize()
{
? return size;
}
template<typename T>
T Queue<T>::getHead()
{
? return head->element;
}
#endif

?

#ifndef STACK_H
#define STACK_H
#include <iostream>
using namespace std;

template<typename T>
class Node2
{
public:
? T element;? // Element contained in the node
? Node2<T> *next; // Pointer to the next node

? Node2() // No-arg constructor
? {
??? next = NULL;
? }

? Node2(T element) // Constructor
? {
??? this->element = element;
??? next = NULL;
? }
};

template<typename T>
class Stack
{
public:
? Stack();
? bool empty();
? T peek();
? T push(T value);
? T pop();
? int getSize();
? void print();
private:
?Node2<T> *head, *tail;
? int size;
};

template<typename T>
Stack<T>::Stack()
{
?head = tail = NULL;
? size = 0;
}

template<typename T>
bool Stack<T>::empty()
{
? return head == NULL;
}

template<typename T>
T Stack<T>::peek()
{
?? if (size == 0)
??? throw runtime_error("Index out of range");
? else
??? return tail->element;
}

template<typename T>
T Stack<T>::push(T element)
{
? if (tail == NULL)
? {
??? head = tail = new Node2<T>(element);
? }
? else
? {
??? tail->next = new Node2<T>(element);
??? tail = tail->next;
? }

? size++;
? return element;
}

template<typename T>
T Stack<T>::pop()
{
?if (size == 0)
??? throw runtime_error("No elements in the list");
? else if (size == 1)
? {
??? Node2<T> *temp = head;
??? head = tail = NULL;
??? size = 0;
??? T element = temp->element;
??? delete temp;
??? return element;
? }
? else
? {
??? Node2<T> *current = head;

??? for (int i = 0; i < size - 2; i++)
????? current = current->next;

??? Node2<T> *temp = tail;
??? tail = current;
??? tail->next = NULL;
??? size--;
??? T element = temp->element;
??? delete temp;
??? return element;
? }
}

template<typename T>
int Stack<T>::getSize()
{
? return size;
}

template<typename T>
void Stack<T>::print()
{
? Node2<T> *point=head;
? while(point!=NULL){
? cout<<point->element<<" ";
? point=point->next;
? }
?cout<<endl;
}
#endif

读书人网 >编程

热点推荐