參考資料:數據結構
大話數據結構spa
http://blog.csdn.net/xy010902100449/article/details/46602273.net
【摘要】計算機科學中,二叉樹是每一個節點最多有兩個子樹的樹結構。一般子樹被稱做「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查找樹和二叉堆。二叉樹是遞歸定義的,所以,與二叉樹有關的題目基本均可以用遞歸思想解決,固然有些題目非遞歸解法也應該掌握,如非遞歸遍歷節點等等。本文努力對二叉樹相關題目作一個較全的整理總結,但願對找工做的同窗有所幫助。code
本文內容以下所示
1. 求二叉樹中的節點個數
2. 求二叉樹的深度
3. 前序遍歷,中序遍歷,後序遍歷
4. 分層遍歷二叉樹(按層次從上往下,從左往右)
5. 將二叉查找樹變爲有序的雙向鏈表
6. 求二叉樹第K層的節點個數
7. 求二叉樹中葉子節點的個數
8. 判斷兩棵二叉樹是否結構相同
9. 判斷二叉樹是否是平衡二叉樹
10. 求二叉樹的鏡像
11. 求二叉樹中兩個節點的最低公共祖先節點
12. 求二叉樹中節點的最大距離
13. 由前序遍歷序列和中序遍歷序列重建二叉樹
14. 判斷二叉樹是否是徹底二叉樹blog
0-二叉樹節點定義遞歸
1 //0.二叉樹的二叉鏈表節點結構定義 2 // 二叉鏈表表示法 3 typedef struct BiTNode 4 { 5 TElemType data; 6 struct BiTNode *lchild,*rchild; 7 } BiTNode,*BiTree;
1-求二叉樹中節點的個數class
1 //5.求樹節點的個數 2 int GetNodeNum(BiTNode * pRoot) 3 { 4 if(pRoot == NULL) // 遞歸出口 5 return 0; 6 //cout<<pRoot->data; 7 int a=GetNodeNum(pRoot->lchild); 8 int b= GetNodeNum(pRoot->rchild); 9 10 return a+ 1; 11 }
2-求樹的深度計算機科學
//3.求二叉樹的高度(深度) int GetDepth(BiTree pRoot) { if(pRoot == NULL) // 遞歸出口 return 0; int depthLeft = GetDepth(pRoot->lchild); int depthRight = GetDepth(pRoot->rchild); return depthLeft > depthRight ? (depthLeft + 1) : (depthRight + 1); }
3-三種遍歷二叉樹
1 //1.前序遍歷 2 void PreOrder(BiTree T) 3 { 4 if(T==NULL) 5 { 6 return; 7 } 8 printf("%5d",T->data); 9 PreOrder(T->lchild); 10 PreOrder(T->rchild); 11 } 12 13 //中序 14 void InOrder(BiTree T) 15 { 16 if(T==NULL) 17 { 18 return; 19 } 20 InOrder(T->lchild); 21 22 printf("%5d",T->data); 23 24 InOrder(T->rchild); 25 } 26 27 //後序 28 void PostOrder(BiTree T) 29 { 30 if(T==NULL) 31 { 32 return; 33 } 34 35 PreOrder(T->lchild); 36 PreOrder(T->rchild); 37 printf("%5d",T->data); 38 }
4-求葉子節點個數遍歷
1 void countLeaf3(BiTree T,int *sum) 2 { 3 if(T!=NULL) 4 { 5 if (T->lchild==NULL&&T->rchild==NULL) 6 { 7 (*sum)++; 8 } 9 if (T->lchild) 10 { 11 countLeaf3(T->lchild,sum); 12 } 13 if (T->rchild) 14 { 15 countLeaf3(T->rchild,sum); 16 } 17 18 } 19 }
5-copy二叉樹
1 //4.copy 二叉樹 2 BiTNode *CopyTree(BiTNode *T) 3 { 4 BiTNode *newNode=NULL; 5 BiTNode *newLp=NULL; 6 BiTNode *newRp=NULL; 7 8 if(T==NULL) 9 { 10 return NULL; 11 } 12 13 if(T->lchild!=NULL) 14 { 15 newLp=CopyTree(T->lchild); 16 } 17 else 18 { 19 newLp=NULL; 20 } 21 22 if(T->rchild!=NULL) 23 { 24 newRp=CopyTree(T->lchild); 25 } 26 else 27 { 28 newRp=NULL; 29 } 30 31 //malloc根節點 32 newNode=(BiTNode*)malloc(sizeof(BiTNode)); 33 if (newNode==NULL) 34 { 35 return NULL; 36 } 37 newNode->lchild=newLp; 38 newNode->rchild=newRp; 39 newNode->data=T->data; 40 return newNode; 41 }