?? page196.cpp
字號:
#include<stack.h>
#include<queue.h>
#define DefaultSize 20
template <class Type> class Tree;
template <class Type> class TreeNode {
friend class Tree<Type>;
private:
Type data;
TreeNode<Type> *firstChild, *nextSibling;
TreeNode ( Type value=0, TreeNode<Type> *fc=NULL, TreeNode<Type> *ns=NULL ):data (value), firstChild (fc), nextSibling (ns) { }
};
template <class Type> class Tree {
public:
Tree ( ) { root = current = NULL; }
void BuildRoot(Type rootVal);
int Root();
int FirstChild();
int NextSibling();
int Parent();
int Find(Type target);
void InsertChild(Type value);
int RemoveChild(int i);
void RemovesubTree();
void PreOrder();
void NorecPreOrder();
void PostOrder();
void PostOrder1();
void LevelOrder();
int IsEmpty();
void visit();
private:
TreeNode<Type> *root, *current;
void PreOrder ( ostream & out, TreeNode<Type> *p );
int Find ( TreeNode<Type> *p, Type target );
void RemovesubTree ( TreeNode<Type> *p );
int FindParent ( TreeNode<Type> *t, TreeNode<Type> *p );
};
template <class Type> void Tree<Type>::BuildRoot ( Type rootVal ) {
root = current = new TreeNode<Type> (rootVal);
}
template <class Type> int Tree<Type>:: Root ( ) {
if ( root == NULL ) {
current = NULL;
return 0;
}
else {
current = root;
return 1;
}
}
template <class Type> int Tree<Type>::FirstChild ( ) {
if ( current != NULL && current->firstChild != NULL ) {
current = current->firstChild; return 1;
}
current = NULL;
return 0;
}
template <class Type> int Tree<Type>::NextSibling ( ) {
if ( current != NULL && current->nextSibling != NULL ) {
current = current->nextSibling;
return 1;
}
current = NULL; return 0;
}
template <class Type> int Tree<Type>::Parent ( ) {
TreeNode<Type> *p = current, *t;
if ( current == NULL || current == root ) { current = NULL; return 0; }
t = root;
int k = FindParent ( t, p );
return k;
}
template <class Type> int Tree<Type>::FindParent ( TreeNode<Type> * t,TreeNode<Type> * p ){
TreeNode<Type> *q = t->firstChild;
while ( q != NULL && q != p ) {
int i=FindParent(q,p);
if( i ) return i;
q = q->nextSibling;
}
if ( q != NULL && q ==p ) { current = t; return 1; }
return 0;
}
template <class Type> int Tree<Type>::Find ( Type target ) {
if ( IsEmpty ( ) ) return 0;
return Find ( root, target );
}
template <class Type> int Tree<Type>::Find ( TreeNode<Type> *p, Type target ) {
int result = 0;
if ( p->data == target ) { result = 1; current = p; }
else {
TreeNode<Type> *q = p->firstChild;
while ( q != NULL && ! ( result = Find ( q, target ) ) ) q = q->nextSibling;
}
return result;
}
template <class Type> void Tree<Type>::InsertChild ( Type value ) {
TreeNode<Type> *newNode = new TreeNode<Type> (value);
if ( current->firstChild == NULL ) current->firstChild = newNode;
else {
TreeNode<Type> *p = current->firstChild;
while ( p->nextSibling != NULL ) p = p->nextSibling;
p->nextSibling = newNode;
}
}
template <class Type> int Tree<Type>::RemoveChild ( int i ) {
TreeNode<Type> * s;
if ( i == 1 ) {
s = current->firstChild;
if ( s != NULL ) current->firstChild = s->nextSibling;
else return 0;
}
else {
TreeNode<Type> *q = current->firstChild; int k = 1;
while ( q != NULL && k < i-1 ) { q = q->nextSibling; k++; }
if ( q != NULL ) {
s = q->nextSibling;
if ( s != NULL )q->nextSibling = s->nextSibling;
else return 0;
}
else return 0;
}
RemovesubTree(s);
return 1;
}
template <class Type> void Tree<Type>::RemovesubTree ( TreeNode<Type> *p ) {
TreeNode<Type> *q = p->firstChild, *next;
while ( q != NULL ) {
next = q->nextSibling;
RemovesubTree ( q ); q = next;
}
delete p;
}
template <class Type> void Tree<Type>::RemovesubTree ( ) {
if ( current != NULL ) {
if ( current == root ) root = NULL;
RemovesubTree ( current ); current = NULL;
}
}
template <class Type> void Tree<Type>::PreOrder ( ) {
if ( !IsEmpty ( ) ) {
visit ( );
TreeNode<Type> *p = current;
int i = FirstChild ( );
while (i) { PreOrder ( ); i = NextSibling ( ); }
current = p;
}
}
template <class Type> void Tree<Type>::PostOrder ( ) {
if ( !IsEmpty ( ) ) {
TreeNode<Type> *p = current;
int i = FirstChild ( );
while (i) {
PostOrder ( );
i = NextSibling ( );
}
current = p;
visit ( );
}
}
template <class Type> void Tree<Type>::NorecPreOrder( ) {
Stack<TreeNode<Type>*> st;
TreeNode<Type> *p = current;
do {
while ( !IsEmpty ( ) ) {
visit ( );
st.Push ( current );
FirstChild ( );
}
while ( IsEmpty ( ) && !st.IsEmpty ( ) ) {
current = st.Pop ( );
NextSibling ( );
}
} while ( !IsEmpty ( ) );
current = p;
}
template <class Type> void Tree<Type>::PostOrder1 ( ) {
Stack<TreeNode<Type>* > st(DefaultSize);
TreeNode<Type> *p = current;
do {
while ( !IsEmpty ( ) ) {
st.Push(current);
FirstChild ( );
}
while ( IsEmpty ( ) && !st.IsEmpty ( ) ) {
current = st.Pop ( );
visit ( );
NextSibling ( );
}
} while ( !IsEmpty ( ) );
current = p;
}
template <class Type> void Tree<Type>::LevelOrder ( ) {
Queue<TreeNode<Type> * > Qu ;
if ( ! IsEmpty ( ) ) {
TreeNode<Type> *p = current; Qu.EnQueue ( current );
while ( !Qu.IsEmpty ( ) ) {
current = Qu.DeQueue ( );
visit ( );
FirstChild ( );
while ( !IsEmpty ( ) ) { Qu.EnQueue ( current ); NextSibling ( ); }
}
current = p;
}
}
template<class Type> void Tree<Type>::visit(){
cout<<current->data<<endl;
}
template<class Type> int Tree<Type>::IsEmpty(){
return current==NULL;
}
void main(){
Tree<int> tree;
tree.BuildRoot(100);
for(int i=0;i<8;i++) tree.InsertChild(i);
tree.PreOrder();
tree.PostOrder();
tree.PostOrder1();
tree.RemoveChild(5);
tree.PreOrder();
tree.NorecPreOrder();
tree.LevelOrder();
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -