数据结构入门小结之树

来源:互联网 发布:人工智能伏羲觉醒2电影 编辑:程序博客网 时间:2024/05/24 07:29

(1) 二叉树的存储单元:

template <typename T>struct BiNode{T data;BiNode<T>* lch;BiNode<T>* rch;};

(2)前序遍历:

递归实现:

template <class T>void BiTree<T>::PreOrder(Node<T>* R){        if(R != NULL)          {                                   cout<<R->data;                PreOrder(R->lch);                                PreOrder(R->rch);          }}

非递归实现:

template <class T> void BiTree<T>::PreOrder(Node<T> *R){       BiNode<T>* S[100];       int top = -1;       while((top != -1)|| (R != NULL))          {              if (R != NULL)                  {                     cout<<R->data;                            S[++top];                     R = R->lch;                  }              else                  {                     R = S[top--];                     R = R->rch;                  }          }}

(3)中序遍历

递归实现:

template <class T>void BiTree<T>::InOrder(Node<T>* R){        if(R != NULL)          {                   InOrder(R->lch);                 cout<<R->data;                   InOrder(R->rch);          }}

非递归实现:

template <class T> void BiTree<T>::InOrder(Node<T> *R){BiNode<T>* S[100];         int top = -1;while((top != -1)|| (R != NULL)){if (R != NULL){     S[++top];R = R->lch;}else{                           R = S[top--];                           cout<<R->data;                           R = R->rch;                                                }}}

(4)后续遍历:

递归实现:

void BiTree<T>::PostOrder(Node<T>* R){        if(R != NULL)          {                                   PostOrder(R->lch);                    PostOrder(R->rch);                cout<<R->data;              }}

非递归实现:

由于后序遍历访问根结点的指针是在遍历完左子树和右子树后,所以需要
判别是左子树返回还是右子树返回,因此栈结点的结构需要额外的一个标记
tag,1代表左子树返回,2代表右子树返回。

template <typename T>struct SNode{BiNode<T>* ptr;int tag;};
template <typename T>void BiTree<T>::PostOrder(BiNode<T>* root){SNode S[100];int top = -1;BiNode<T>* R = root;do {while(R != NULL){S[++top].ptr = R;S[top].tag = 1;R = R->lch;}while((top != -1) && (S[top].tag == 2)){cout<<S[top--].ptr->data;}if ((top != -1) && (S[top].tag == 1)){R = S[top].ptr->rch;S[top].tag = 2;}} while(top != -1);}

(5)层次遍历

根节点非空,入队;

如果队列不空

{

          对头元素出队;
          访问该元素;
          若该结点的左孩子非空,则左孩子入队;
          若该结点的右孩子非空,则右孩子入队;

}

 

template <typename T>void BiTree<T>::LevelOrder(BiNode<T>* R){BiNode<T>* queue[MAXSIZE];int f = 0;int r = 0;if (R != NULL)queue[++r] = R;while(f != r){BiNode<T>* p = queue[++f];cout<<p->data;if (p->lch != NULL)queue[++r] = p->lch;if(p->rch != NULL)queue[++r] = p->rch;}}



 

 



 

 

原创粉丝点击