#include<iostream> #include<stack> #include<queue> using namespace std; template <class T> class BinaryTree; template <class T> class BinaryTreeNode { friend class BinaryTree<T>; private: T data; //二叉树数据域 BinaryTreeNode *leftchild; //左孩子指针 BinaryTreeNode *rightchild; //右孩子指针 public: BinaryTreeNode(){leftchild=rightchild=NULL;} BinaryTreeNode(const T elem) { data=elem; leftchild=rightchild=NULL; } BinaryTreeNode(const T elem,BinaryTreeNode<T> *l,BinaryTreeNode<T> *r) { data=elem; leftchild=l; rightchild=r; } BinaryTreeNode<T> * left() const{return leftchild;} BinaryTreeNode<T> * right() const{return rightchild;} void setLeft(BinaryTreeNode *l){leftchild=l;} void setRight(BinaryTreeNode *r){rightchild=r;} void setValue(const T value){data=value;} T getValue(){return data;} bool isLeaf() { if(leftchild==NULL&&rightchild==NULL) return true; else return false; } BinaryTreeNode<T>& operator = (const BinaryTreeNode<T> &Node) { cout << "=" ; data=Node.data; leftchild=Node.leftchild; rightchild=Node.leftchild; return *this; } }; template <class T> class BinaryTree { private: BinaryTreeNode<T> *root; public: BinaryTree(){root=NULL;} bool isEmpty() const { if(root==NULL) return true; return false; }; BinaryTreeNode<T> * Root(){return root;} BinaryTreeNode<T> * Parent(BinaryTreeNode<T> *current); BinaryTreeNode<T> * LeftSibling(BinaryTreeNode<T> *current); BinaryTreeNode<T> * RightSibling(BinaryTreeNode<T> *current); void CreatTree(const T &info,BinaryTree<T> &left,BinaryTree<T> &right); void PreOrder(BinaryTreeNode<T> *root); void InOrder(BinaryTreeNode<T> *root); void PostOrder(BinaryTreeNode<T> *root); void LevelOrder(BinaryTreeNode<T> *root); void deleteBinaryTree(BinaryTreeNode<T> *root); void PreOrderWithoutRecursion(BinaryTreeNode<T> *root); void InOrderWithoutRecursion(BinaryTreeNode<T> *root); void PostOrderWithoutRecursion(BinaryTreeNode<T> *root); }; template <class T> class StackElem{ public: BinaryTreeNode<T> *pointer; int tag; }; template <class T> BinaryTreeNode<T> * BinaryTree<T>::Parent(BinaryTreeNode<T> *current) //返回当前结点的父结点 { using std::stack; stack<BinaryTreeNode<T> *> aStack; //使用栈存放未访问右子树的结点 BinaryTreeNode<T> *pointer=root; if(root!=NULL&¤t!=NULL) { while(!aStack.empty()||pointer!=NULL) { if(pointer!=NULL) { if(current==pointer->left()||current==pointer->right()) return pointer; aStack.push(pointer); pointer=pointer->left(); } else { pointer=aStack.top(); aStack.pop(); pointer=pointer->right(); } } return NULL; } else return NULL; } template <class T> BinaryTreeNode<T> * BinaryTree<T>::LeftSibling(BinaryTreeNode<T> *current) //返回当前节点左兄弟 { using std::stack; stack<BinaryTreeNode<T> *>aStack; BinaryTreeNode<T> *pointer=root; if(root!=NULL&¤t!=NULL) { while(!aStack.empty()||pointer!=NULL) { if(pointer!=NULL) { if(current==pointer->right()&&(pointer->left())!=NULL) return pointer->left(); aStack.push(pointer); aStack.pop(); pointer=pointer->left(); } else { pointer=aStack.top(); aStack.pop(); pointer=pointer->right(); } } return NULL; } else return NULL; } template <class T> BinaryTreeNode<T> * BinaryTree<T>::RightSibling(BinaryTreeNode<T> *current) //返回当前节点右兄弟 { using std::stack; stack<BinaryTreeNode<T> *>aStack; BinaryTreeNode<T> *pointer=root; if(root!=NULL&¤t!=NULL) { while(!aStack.empty()||pointer!=NULL) { if(pointer!=NULL) { if(current==pointer->left()&&(pointer->right())!=NULL) return pointer->right(); aStack.push(pointer); aStack.pop(); pointer=pointer->left(); } else { pointer=aStack.top(); aStack.pop(); pointer=pointer->right(); } } return NULL; } else return NULL; } template <class T> void BinaryTree<T>::CreatTree(const T &info,BinaryTree<T> &left,BinaryTree<T> &right) //创建树 { root=new BinaryTreeNode<T>(info,left.root,right.root); left.root=right.root=NULL; } template <class T> void BinaryTree<T>::PreOrder(BinaryTreeNode<T> *root) //先序遍历 { if(root!=NULL) visit(root); else return; PreOrder(root->left()); PreOrder(root->right()); } template <class T> void BinaryTree<T>::InOrder(BinaryTreeNode<T> *root) //中序遍历 { if(root==NULL) return; InOrder(root->left()); visit(root); InOrder(root->right()); } template <class T> void BinaryTree<T>::PostOrder(BinaryTreeNode<T> *root) //后序遍历 { if(root==NULL) return; PostOrder(root->left()); PostOrder(root->right()); visit(root); } template <class T> void BinaryTree<T>::LevelOrder(BinaryTreeNode<T> *root) //层次遍历 { using std::queue; queue<BinaryTreeNode<T> *> aQueue; BinaryTreeNode<T> *p=root,*q; aQueue.push(p); while(!aQueue.empty()) { p=aQueue.front(); aQueue.pop(); visit(p); q=p; if((p->left())!=NULL) { q=p->left(); aQueue.push(q); } if((p->right())!=NULL) { q=p->right(); aQueue.push(q); } } } template <class T> void BinaryTree<T>::deleteBinaryTree(BinaryTreeNode<T> *root) //删除以root为根节点的树 { if(root==NULL)return; deleteBinaryTree(root->left()); deleteBinaryTree(root->right()); delete root; root=NULL; } template <class T> void BinaryTree<T>::PreOrderWithoutRecursion(BinaryTreeNode<T> *root) //无递归先序遍历 { //先输出将当前结点,并将当前结点的右子树放入栈中,再访问左子树 //无结点可访问时弹出栈顶元素 using std::stack; stack<BinaryTreeNode<T> *>aStack; BinaryTreeNode<T> *pointer=root; aStack.push(NULL); //栈底监视哨 while(pointer!=NULL) { visit(pointer); if((pointer->right())!=NULL)aStack.push(pointer->right()); if((pointer->left())!=NULL)aStack.push(pointer->left()); //左子树压栈后马上就会被弹出 pointer=aStack.top(); aStack.pop(); } } template <class T> void BinaryTree<T>::InOrderWithoutRecursion(BinaryTreeNode<T> *root) //无递归中序遍历 { //遇到结点先入栈,无结点可访问时出栈 using std::stack; stack<BinaryTreeNode<T> *>aStack; BinaryTreeNode<T> *pointer=root; while(!aStack.empty()||pointer!=NULL) { if(pointer!=NULL) { aStack.push(pointer); pointer=pointer->left(); } else{ pointer=aStack.top(); aStack.pop(); visit(pointer); pointer=pointer->right(); } } } template <class T> void BinaryTree<T>::PostOrderWithoutRecursion(BinaryTreeNode<T> *root) //无递归中序遍历 { //遇到结点打标记,出栈时如果是右子树已访问则访问结点,否则继续入栈 using std::stack; StackElem<T> elem; stack<StackElem<T> > aStack; BinaryTreeNode<T> *pointer; if(root==NULL)return; else pointer=root; while(!aStack.empty()||pointer!=NULL) { while(pointer!=NULL) { elem.pointer=pointer; elem.tag=1; aStack.push(elem); pointer=pointer->left(); } elem=aStack.top(); aStack.pop(); pointer=elem.pointer; if(elem.tag) { elem.tag=0; aStack.push(elem); pointer=pointer->right(); } else { visit(pointer); pointer=NULL; } } } void dCreat(BinaryTree<int> &t) //先序递归建树 { BinaryTree<int> l,r; int a; cin>>a; if(a==0) //输入0认为当前结点为空 { return; } dCreat(l); dCreat(r); t.CreatTree(a,l,r); } void visit(BinaryTreeNode<int> *Root) //访问结点元素 { if(Root!=NULL) cout << Root->getValue() <<" "; } int main() { BinaryTreeNode<int> *d; BinaryTreeNode<int> e(10); BinaryTree<int> a,b,c; int n,s,l=1; cin >>n; while((n--)>0) { dCreat(a); cout << "PreOrder:"; a.PreOrder(a.Root()); cout <<endl; cout << "PreOrderWithoutRecursion:"; a.PreOrderWithoutRecursion(a.Root()); cout <<endl; cout <<"InOrder:"; a.InOrder(a.Root()); cout <<endl; cout <<"InOrderWithoutRecursion:"; a.InOrderWithoutRecursion(a.Root()); cout <<endl; cout <<"PostOrder:"; a.PostOrder(a.Root()); cout <<endl; cout <<"PostOrderWithoutRecursion:"; a.PostOrderWithoutRecursion(a.Root()); cout <<endl; cout <<"LevelOrder:"; a.LevelOrder(a.Root()); cout<<endl; d=a.Root(); d=d->left(); d=a.Parent(d); visit(d); cout <<endl; d=d->left(); d=a.RightSibling(d); visit(d); d=a.Root(); cout <<endl; d=a.LeftSibling(d->right()); visit(d); d=a.Parent(a.Root()); visit(d); cout <<endl; a.deleteBinaryTree(a.Root()); } return 0; } /* 2 5 1 2 0 0 3 0 0 0 5 1 2 0 0 3 0 0 4 0 0 */ /* 样例树: 5 / 1 / 2 3 5 / 1 4 / 2 3 */