在数据量较小时,和递归版本的时间是差不多的,额因为还没有去看算法的那个计算时间复杂度和空间复杂度的东西,所以对那个不懂,只能用最直观的测试时间来判断速度
文件"trees.h"
#include<iostream> using namespace std; template<class T> class My_stack; template<class T> class Node //结点类 { private: T data; Node<T> *next; public: Node() { next=NULL; } Node(T d) { data=d; next=NULL; } friend My_stack<T>; }; template<class T> class My_stack { private: Node<T> *head; public: My_stack() { head=new Node<T>(); } bool empty() const { return (head->next==0); } void push(T d) //入栈 { Node<T> *p=new Node<T>(d); p->next=head->next; head->next=p; } T top() //返回栈顶元素 { if(empty()) { cout<<"stack is empty."<<endl; exit(1); } Node<T> *p=head->next; T temp=p->data; return temp; } void pop() //弹出栈顶元素 { Node<T> *p=head->next; head->next=p->next; delete p; } }; class BinTree; class BinNode { private: int data; int tag;//用于作为是否为第一次入栈的标志 BinNode *lchild; BinNode *rchild; friend class BinTree; }; class BinTree { private: BinNode *root; public: BinTree() { root=0; } BinNode *Get_Root() { return root; } BinNode *Create_Tree(BinNode *r) //先序建立二叉树 { int d; cout<<"输入数据(0代表空):"; cin>>d; if(d==0) return NULL; else { r=new BinNode; r->data=d; r->lchild=Create_Tree(r->lchild); r->rchild=Create_Tree(r->rchild); } root=r; return r; } bool _empty() { return (root==0); } void PreOrder_rec(BinNode *r) //先序遍历 { My_stack<BinNode *> s; BinNode *p=r; while(p || !s.empty()) { if(p) { cout<<p->data<<" "; s.push(p); p=p->lchild; } else { p=s.top(); s.pop(); p=p->rchild; } } } void InOrder_rec(BinNode *r) //中序遍历 { My_stack<BinNode *> s; BinNode *p; p=r; while(p || !s.empty()) { if(p) { s.push(p); p=p->lchild; } else { p=s.top(); s.pop(); cout<<p->data<<" "; p=p->rchild; } } } void PostOrder_rec(BinNode *r) //后序遍历 { My_stack<BinNode *> s; BinNode *p=r; do { if(p) { p->tag=0; s.push(p); p=p->lchild; } else { p=s.top(); s.pop(); if(p->tag==0) { p->tag=1; s.push(p); p=p->rchild; } else { cout<<p->data<<" "; p=NULL; } } }while(p || !s.empty()); } int Leaf_rec(BinNode *r) //计算叶子结点数目 { My_stack<BinNode *> s; int sum=0; if(!r) return 0; else { s.push(r); do { r=s.top(); s.pop(); if(r->lchild==0 && r->rchild==0) sum=sum+1; else { if(r->lchild) s.push(r->lchild); if(r->rchild) s.push(r->rchild); } }while(!s.empty()); } return sum; } };
测试函数"main.cpp"
输入和上一篇文章的是一样的,下面是输出结果
6034

被折叠的 条评论
为什么被折叠?



