樹的三種遍歷(遞歸和非遞歸)

typedef struct BiTNode
{  
    char data;  
    struct BiTNode *lchild, *rchild;      //左右孩子  
}BiTNode,*BiTree;  

//先序遍歷(根左右)(遞歸)

void LastOrder(BiTNode *root)
{
 	if(root != NULL)
 	{
 		cout << root->data<<endl;
 		LastOrder(root->lchild);
 		LastOrder(root->rchild); 
 	}   
}

void PreOrder(BiTNode *root){ if(root != NULL) { cout << root->data<<endl; PreOrder(root->lchild); PreOrder(root->rchild); } }


//中序遍歷(左根右)(遞歸)

void MidOrder(BiTNode *root)
{
 	if(root != NULL)
 	{
 		MidOrder(root->lchild);
 		cout << root->data<<endl;
 		MidOrder(root->rchild); 
 	}   
}

//後續遍歷(左右根)(遞歸)

void LastOrder(BiTNode *root)
{
 	if(root != NULL)
 	{
 		cout << root->data<<endl;
 		LastOrder(root->lchild);
 		LastOrder(root->rchild); 
 	}   
}
//先序的非遞歸 需要用到棧

void PreOrder(BiTNode *root)
{
    if(root == NULL)
    	return NULL;
 	stack<BiTNode> st;
 	st.push(root);
 	BiTNode *temp;
 	while(!st.empty())
 	{
 		temp = st.top();  //返回棧頂元素
 		cout<<temp->data<<" ";
 		st.pop();
 		if(temp->rchild!=NULL)  //這裏先遍歷右節點,因爲棧是後進先出,因爲要先出左節點,所以要先進右節點
 		    st.push(temp->rchild);
 		if(temp->lchild!=NULL)
 		    st.push(temp->lchild);
 	} 
}

//中序的非遞歸

void MidOrder(BiTNode *root)
{
	if (root == NULL)
	    return NULL;
	 stack<BiTNode*> st;
	 BiTNode cur = root->lchild;  //create one pointer point to root's left node
	 st.push(root);    //root into stack
	 while(cur != NULL && !(st.empty()))
	 {
	 while(cur !=NULL )
	     {
              st.push(cur);
              cur = cur->lchild;   //一直向左遍歷,然後進棧
	     }
	 cur = st.top();    //cur = stack.top 就是最左的那個位置
	 st.pop();      //最左出棧
	 cout<<cur->data<<" ";  //輸出最左
	 cur = cur->rchild;   
	 }
}
//後序非遞歸(待補充)

//樹的深度

int depth(BiTNode *root)
{
	if(root==NULL)//如果rootoot爲NULL,則深度爲0,這也是遞歸的返回條件
        return 0;
    //如果pRoot不爲NULL,那麼深度至少爲1,所以left和right=1
    int left=1;
    int right=1;
    left+=depth(root->lchild);//求出左子樹的深度
    right+=depth(root->rchild);//求出右子樹深度

    return (left>right?left:right)+1;//返回深度較大的那一個,+1是因爲沒算根節點那一層
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章