遞迴求解二叉樹任意一結點的深度
這個事最後一道大題的第一小題
讓寫個遞迴演算法求解二叉樹任意一結點的深度
首先應該去遞迴找到這個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;
}
相關文章
- 樹遞迴問題的求解遞迴
- 【資料結構】二叉樹遍歷(遞迴+非遞迴)資料結構二叉樹遞迴
- 二叉樹任意兩個節點間的最大距離(Java,LeetCode 543二叉樹的直徑 遞迴)二叉樹JavaLeetCode遞迴
- 二叉樹的遞迴套路二叉樹遞迴
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- 《劍指offer》:[39]求解二叉樹的深度二叉樹
- [演算法系列]遞回應用——二叉樹(2):一種帶資訊遞迴返回的求解方式演算法二叉樹遞迴
- 資料結構之二叉樹遞迴操作資料結構二叉樹遞迴
- 二叉樹遞迴練習二叉樹遞迴
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 樹(2)--二叉樹的遍歷(非遞迴)+線索二叉樹二叉樹遞迴
- 什麼是遍歷二叉樹,JavaScript實現二叉樹的遍歷(遞迴,非遞迴)二叉樹JavaScript遞迴
- 二叉樹非遞迴遍歷二叉樹遞迴
- 刷題系列 - Python用遞迴實現求二叉樹深度Python遞迴二叉樹
- 【資料結構】——搜尋二叉樹的插入,查詢和刪除(遞迴&非遞迴)資料結構二叉樹遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- 通用-遞迴樹結構遞迴
- 二叉平衡樹 python 列表 遞迴Python遞迴
- 二叉樹的前中後序遍歷(遞迴和非遞迴版本)二叉樹遞迴
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- [java] 二叉樹的後序遍歷(遞迴與非遞迴實現)Java二叉樹遞迴
- 遍歷二叉樹的迭代和遞迴方法二叉樹遞迴
- 二叉樹的非遞迴遍歷寫法二叉樹遞迴
- 樹3-二叉樹非遞迴遍歷(棧)二叉樹遞迴
- 二叉樹的子結構、深度以及重建二叉樹二叉樹
- 二叉樹建立及遍歷演算法(遞迴及非遞迴)二叉樹演算法遞迴
- 非遞迴先序遍歷二叉樹遞迴二叉樹
- 【刷題】二叉樹非遞迴遍歷二叉樹遞迴
- 二叉樹 遞迴 洛谷P1364二叉樹遞迴
- 資料結構初階--二叉樹(前中後序遍歷遞迴+非遞迴實現+相關求算結點實現)資料結構二叉樹遞迴
- 【每日一題】二叉樹的前中後序非遞迴整理每日一題二叉樹遞迴
- 二叉樹建立後,如何使用遞迴和棧遍歷二叉樹?二叉樹遞迴
- 二叉樹的建立與遍歷(遞迴實現)二叉樹遞迴
- 二叉樹的所有遍歷非遞迴實現二叉樹遞迴
- 二叉樹的非遞迴遍歷——java實現二叉樹遞迴Java
- Day14 | 二叉樹遞迴遍歷二叉樹遞迴
- 不用遞迴實現樹形結構的一種方法遞迴