数的遍历c++实现

#include #include #ifndef BINARY_SEARCH_TREE #define BINARY_SEARCH_TREE using namespace std; template class Stack:public stack { public: T pop() { T tmp = top(); stack ::pop(); return tmp; } void push(T el) { stack ::push(el); } }; template class Queue:public queue { public: T dequeue() { T tmp=front(); queue ::pop(); return tmp; } void enqueue(const T& el) { push(el); } }; template class BSTNode { public: BSTNode() { left=right=0; } BSTNode(const T&el,BSTNode *l=0,BSTNode *r=0) { key=el;left=l;right=r; } T key; BSTNode *left,*right; }; template class BST { BST() { root=0; } ~BST() { clear(); } void clear() { clear(root); root=0; } bool isEmpty()const { return root=0; } void preorder() { preorder(root); } void inorder() { inorder(root); } void postorder() { postorder(root); } T & search(const T &el)const { return serach(root,el); } void breadthFirst(); void iterativePreorder(); void iterativeInorder(); void iterativePostorder(); void deleteByMerging(BSTNode *&); void findAndDeleteMerging(const T&); void deleteByCopying(BSTNode * &); void balance(T *,int,int); protected: BSTNode root; void clear(BSTNode *); T *serach(BSTNode *,const T&)const; void preorder(BSTNode *); void inorder(BSTNode *); void postorder(BSTNode *); virtual void visit(BSTNode *p) { cout< key<<' '; } }; template T *BST ::serach(BSTNode * p,const T &el)const { while(p!=0) if(el==p->key) return &p->key; else if(el key) p=p->key; else p=p->right; return 0; } template class BST ::breadthFirst() { Queue *>queue; BSTNode *p=root; if(p!=0) { queue.enqueue(p); while(!queue.empty()) { p=queue.dequeue(); // 广度优先算法 visit(p); if(p->left!=0) queue.enqueue(p->left); if(p->right!=0) queue.enqueue(p->right); } } } template void BST ::inorder(BSTNode *p) // 中序深度优先 { if(p!=0) { inorder(p->left); visit(p); inorder(p->right); } } template void BST ::preorder(BSTNode * p) // 先序 深度优先 { if(p!=0) { visit(p); preorder(p->left); preorder(p->right); } } void BST ::postorder(BSTNode * p) // 后序 深度优先 { if(p!=0) { postorder(p->left); postorder(p->right); visit(p); } } template void BST ::iterativePreorder() // 先序 非递归 堆栈方式实现 { stack *>travStack; BSTNode *p =root; if(p!=0) { travStack.push(p); while(travStack.empty()) { p=travStack.pop(); visit(p); if(p->right!=0); travStack.push(p->right); if(p->left!=0); travStack.push(p->left); } } } template void BST ::iterativePostorder() //后序 遍历 堆栈方式实现 { stack *>travStack; BSTNode *p=root,*q=root; while(p!=0) { for(;p->left!=0;p=p->right) travStack.push(p); while(p!=0&&(p->right==0 ||p->right==q) { visit(p); q=p; return; p=travStack.pop(); } travStack.push(p); p=p->right; } } template void BST ::iterativeInorder() //中序遍历 堆栈方式实现 { Stack *>travStack; BSTNode *p=root; while(p!=0) { while(p!=0) { if(p->right) travStack.push(p->right); p=p->left; } p=travStack.pop(); while(!travStack.empty()&& p->right==0) { visit(p); p=travStack.pop(); } visit(p); if(!travStack.empty()) p=travStack.pop(); else p=0; } } #endif
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值