类的指针类型。(1)在一颗二叉树上,中序遍历访问的第一个节点是该书上最左下方的叶子节点。 将当前指针current指向该节点(如果存在的话)。并将该路径上所有节点(除当前节点外一一进桟)。
(2)接下来就求下一个要访问的的节点,若当前节点有右节点,则下一个要访问的是当前右节点
的最左方的叶子节点,否则就是桟中的节点 */
#include \"LinkedDeque.h\" #include \"stack.h\"
template class TowTree; template class TreeNode //二叉树的节点类 {
public: T element; TreeNode *left,*right; TreeNode() {left=right=NULL;} TreeNode(const T &x) {element=x;left=right=NULL;} TreeNode(T &x,TreeNode *l=NULL,TreeNode *r=NULL); friend class TowTree; };templateTreeNode::TreeNode(T &x,TreeNode *l,TreeNode *r) { element=x; left=l; right=r; }template class TowTree //二叉树类 {
private: TreeNode *root; void Preorder(void (*Visit)(T &x),TreeNode *r); //前序遍历递归私有成员函数 void Inproder(void (*Visit)(T &x),TreeNode *r); //中序遍历递归私有成员函数 void Postorder(void (*Vist)(T &x),TreeNode *r); //后序遍历私有递归成员函数 protected: int Size(TreeNode *r); //利用后序遍历计算二叉树的节点总数 void Delete(TreeNode *r); //后序遍历释放二叉树的所有节点 TreeNode* Copy(TreeNode *r); //复制构造函数public: TowTree() {root=NULL;} TowTree(TreeNode *r) {root=r;} //构造一颗空的二叉树 ~TowTree() {Delete(root);} //调用销毁函数 bool Root(T &x); //返回树根的元素 bool IsEmpty(); //判断一颗二叉树是否为空 bool MakeTree(T x,TowTree &l,TowTree &r); //构造一颗二叉树 bool DismantleTree(T &x,TowTree &l,TowTree &r); //把一颗二叉树拆分为三部分 void Traverse(void (*Visit)(T &x)); //非递归成员函数层次遍历二叉树 void PreorderderTraverse(void (*Visit)(T &x)); //非递归先序遍历二叉树 void InproderTraverse(void (*Visit)(T &x)); //非递归中序遍历二叉树 int Size() { return Size(root); } void Copy() //调用复制构造函数 { TreeNode *t; t=Copy(root); cout<<\" 后序遍历复制二叉树\"; Postorder(Visit); Delete(t); } void Preorder(void (*Visit)(T &x)) //调用私有成员函数前序遍历二叉树 { Preorder(Visit,root); } void Inproder(void (*Visit)(T &x)) //调用私有成员函数中序遍历二叉树 { Inproder(Visit,root); } void Postorder(void (*Visit)(T &x)) //调用私有成员函数后序遍历二叉树 { Postorder(Visit,root); } };template bool TowTree::Root(T &x) { if(!Root) return false; x=root->element; return true;}
template bool TowTree::MakeTree(T x,TowTree &l,TowTree &r) //实现创建一颗二叉树 { if(root || &l == &r) return false; root=new TreeNode(x,l.root,r.root); l.root=r.root=NULL; //注意这一步骤要把左右子树的根节点置为空值 return true; }template bool TowTree::DismantleTree(T &x,TowTree &l,TowTree &r) //拆分二叉树 { if(!root || &l == &r) return false; x=root->element; l.root=root->left; r.root=root->right; delete root; root=NULL; return true; }template void TowTree::Traverse(void (*Visit)(T &x)) //利用队列的先进先出,从左到右一次遍历二叉树的节点 { TreeNode *t=root; deque *> d; if(t) { d.Insert(t); while(!d.IsEmpty()) //如果队列为空则退出循环 { t=d.Dedeque(t); Visit(t->element); if(t->left) d.Insert(t->left); if(t->right) d.Insert(t->right); } } }template void TowTree::Preorder(void (*Visit)(T &x),TreeNode *r) //实现前序遍历递归算法 { if(r){ Visit(r->element); Preorder(Visit,r->left); Preorder(Visit,r->right); } }
template void TowTree::Inproder(void (*Visit)(T &x),TreeNode *r) //实现中序遍历递归算法 { if(r!=NULL) { Inproder(Visit,r->left); Visit(r->element); Inproder(Visit,r->right); } }template void TowTree::Postorder(void (*Visit)(T &x),TreeNode *r) //实现后续遍历递归算法 { if(r) { Postorder(Visit,r->left); Postorder(Visit,r->right); Visit(r->element); } }template void TowTree::PreorderderTraverse(void (*Visit)(T &x)) //实现前序遍历的非递归算法 { TreeNode *p=root; stack *> s(SIZE); s.Push(p); if(!p) exit(0); while(!s.IsEmpty()) { s.Top(p); s.Pop(); Visit(p->element); if(p->right) s.Push(p->right); if(p->left) s.Push(p->left); } }template void TowTree::InproderTraverse(void (*Visit)(T &x)) //实现中序遍历的非递归算法 { TreeNode *current=root; stack *> s(SIZE); s.Push(current); while(current->left!=NULL) //首先是指针current指向第一个要访问的元素 { s.Push(current->left); s.Top(current); } Visit(current->element); //访问第一个要访问的元素 s.Pop(); //弹出第一个访问的元素 while(current) //访问下一个要访问的元素 { if(current->right!=NULL) //首先看右子树是否为空,若不为空下一个要访问的元素就是该右子树最左边的叶子节点 { s.Push(current->right); //将右子树压入桟中 s.Top(current); //指向该右子树 while(current->left!=NULL) //将该右子树到最左边的叶子节点路径上所有节点压入桟中 { s.Push(current->left); s.Top(current); //该最左边的叶子节点即为将要访问的元素 } } else if(!s.IsEmpty()) //如果右子树为空则下一个要访问的是桟中元素,显示并弹出该元素 { s.Top(current); s.Pop(); Visit(current->element); } else current=NULL; } }template int TowTree::Size(TreeNode *r) //计算节点数目 { if(!r) return 0; else return Size(r->left)+Size(r->right)+1; }template TreeNode* TowTree::Copy(TreeNode *r) //复制一颗二叉树 { if(!r) return NULL; TreeNode *p=new TreeNode(r->element); p->left=Copy(p->left); p->right=Copy(p->right); return p; }template void TowTree::Delete(TreeNode *r) { if(r) { Delete(r->left); Delete(r->right); delete r; } }template void Visit(T &x) { cout<int main() { int n; TowTree a,b,c,x,y,z; y.MakeTree('E',a,b); z.MakeTree('F',a,b); x.MakeTree('C',y,z); y.MakeTree('D',a,b); z.MakeTree('B',y,x); cout<<\"前序遍历\"; z.Preorder(Visit); cout<//释放整个二叉树 cout<<\"二叉树的节点数为\"; n=z.Size(); cout<