遞迴求解二叉樹任意一結點的深度

jsjliuyun發表於2014-11-23

這個事最後一道大題的第一小題

讓寫個遞迴演算法求解二叉樹任意一結點的深度

首先應該去遞迴找到這個x結點,找到後然後再遞迴求解以x為根結點的子樹的深度,所以我就很規矩(當然我覺得這樣寫比較明瞭)寫了兩個遞迴函式

當然首先還是得建立二叉排序樹

另外註明:是用vs2010寫的,沒有在vc++6.0上面測試,如果朋友們發現在vc++上有bug,歡迎指出,供後來者看看

貼下自己的程式碼

//功能:遞迴演算法,求二叉樹中以元素值為x的結點為根的子樹的深度
//時間:2014-11-23

#include <iostream>
using namespace std;

//二叉連結串列資料結構定義
#define TElemType int
typedef struct BiTNode{
	TElemType data;
	struct BiTNode *lchild, *rchild;
}*BiTree;

//定義樹的根節點
BiTree root=NULL;

//根據輸入的序列建立一顆二叉排序樹(Binary Sort Tree),它的中序遍歷是有序的
void CreatBST(const int &a)
{
	BiTree p,q,s;
	//分配結點s的記憶體空間
	s=(BiTree)malloc(sizeof(BiTNode));
	//將插入的值a賦值給s結點,並初始化左右孩子
	s->data=a;
	s->lchild=NULL;
	s->rchild=NULL;
	//判斷根節點是否為空
	if(root==NULL)
	{//為空
		root=s;
		return;
	}else{
		//不為空
		p=root;
		while(p)
		{
			//儲存p指標
			q=p;
			if(p->data==a)
			{
				cout << "該結點已經存在,請重新輸入"<<endl;
				return;
			}else if(p->data>a){
				//指向左孩子
				p=p->lchild;
			}else{
				//指向右孩子
				p=p->rchild;
			}
		}
		//插入s結點
		if(s->data>q->data)
			q->rchild=s;
		else
			q->lchild=s;
	}
}
//求以T為根節點二叉樹的深度
int GetDepth(const BiTree &T)
{
	//定義以T為根節點的左子樹和右子樹的深度
	int rHeight,lHeight;
	//判斷T是否為空
	if(T)
	{
		//遞迴獲取左子樹的深度
		lHeight=GetDepth(T->lchild);
		//遞迴獲取右子樹的深度
		rHeight=GetDepth(T->rchild);
		return (lHeight>rHeight? lHeight:rHeight)+1;
	}else{
		return 0;
	}

}
//以元素值為x的節點為根的子樹深度
int GetSubDepth(const BiTree &T , const TElemType &x)
{
	//判斷T是否為空
	if(T)
	{
		//當節點的值為x時,直接返回求以x為根節點的深度
		if(T->data==x)
		{
			//輸出以x為根結點的深度
			cout<< "以元素值為"<< x << "的結點為根的子樹的深度為: " << GetDepth(T) << endl;
			//退出函式
			exit(0);
		}else{
			//遞迴遍歷左子樹找x結點
			if(T->lchild)
				GetSubDepth(T->lchild,x);
			//遞迴遍歷右子樹找x結點
			if(T->rchild)
				GetSubDepth(T->rchild,x);
		}
	}else{
		return 0;
	}
}
//主函式
int main()
{
	int x;
	//輸入要建立二叉樹的序列
	while(1)
	{
		cout << "請輸入要建立二叉樹的結點資料(不要重複,以-1結束):  ";
		cin >> x;
		if(x==-1)
			break;
		//插入二叉樹
		CreatBST(x);
	}
	cout <<"請輸入所求深度的根結點值x:  ";
	cin >> x;
	//獲取以x為根節點的子樹深度
	GetSubDepth(root,x);
	return 0;
}


相關文章