实现二叉树的先序遍历、中序遍历、后序遍历
一、二叉樹定義
1.樹的術(shù)語:
?
樹的結(jié)點(diǎn):包含一個(gè)數(shù)據(jù)元素及若干指向子樹的分支;
孩子結(jié)點(diǎn):結(jié)點(diǎn)的子樹的根稱為該結(jié)點(diǎn)的孩子;
雙親結(jié)點(diǎn):B 結(jié)點(diǎn)是A 結(jié)點(diǎn)的孩子,則A結(jié)點(diǎn)是B 結(jié)點(diǎn)的雙親;
兄弟結(jié)點(diǎn):同一雙親的孩子結(jié)點(diǎn); 堂兄結(jié)點(diǎn):同一層上結(jié)點(diǎn);
祖先結(jié)點(diǎn): 從根到該結(jié)點(diǎn)的所經(jīng)分支上的所有結(jié)點(diǎn)子孫結(jié)點(diǎn):以某結(jié)點(diǎn)為根的子樹中任一結(jié)點(diǎn)都稱為該結(jié)點(diǎn)的子孫
結(jié)點(diǎn)層:根結(jié)點(diǎn)的層定義為1;根的孩子為第二層結(jié)點(diǎn),依此類推;
樹的深度:樹中最大的結(jié)點(diǎn)層
結(jié)點(diǎn)的度:結(jié)點(diǎn)子樹的個(gè)數(shù)
樹的度: 樹中最大的結(jié)點(diǎn)度。
葉子結(jié)點(diǎn):也叫終端結(jié)點(diǎn),是度為 0 的結(jié)點(diǎn);
分枝結(jié)點(diǎn):度不為0的結(jié)點(diǎn);
有序樹:子樹有序的樹
無序樹:不考慮子樹的順序
2.由樹引出二叉樹
?
二叉樹的每個(gè)結(jié)點(diǎn)至多只有二棵子樹(不存在度大于2的結(jié)點(diǎn)),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2^(i-1)個(gè)結(jié)點(diǎn);深度為k的二叉樹至多有2^k-1個(gè)結(jié)點(diǎn)。
?
二叉樹有五種基本形態(tài):
(1)空二叉樹;
(2)只有一個(gè)根結(jié)點(diǎn)的二叉樹;
(3)只有左子樹;
(4)只有右子樹;
(5)完全二叉樹
盡管二叉樹與樹有許多相似之處,但二叉樹不是樹的特殊情形。(當(dāng)有序樹只有一個(gè)節(jié)點(diǎn)時(shí)沒有左右之分,而二叉樹不是)
3.二叉樹的遍歷
對(duì)一棵二叉樹的遍歷有三種情況:先(根)序遍歷:首先訪問根,再先序遍歷左子樹,最后先序遍歷右子樹 中(根)序遍歷:首先中序遍歷左子樹,再訪問根,最后中序遍歷右子樹 后(根)序遍歷:首先后序遍歷左子樹,再后序遍歷右子樹,最后訪問根
附上代碼:
#include<stdio.h> #include<stdlib.h> typedef char TElemType; #define OK 1 #define ERROR 0 typedef int Status;typedef struct BiTNode{TElemType data;struct BiTNode* LChild,*RChild; }BiTNode,*BiTree;Status Visit(TElemType e){if(e!=' ')printf("%c ",e);return OK; }Status PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){if(T){if(Visit(T->data)){if(PreOrderTraverse(T->LChild,Visit)){if(PreOrderTraverse(T->RChild,Visit)){return OK;}}}return ERROR;}else{return OK;} }Status InOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){if(T){if(InOrderTraverse(T->LChild,Visit)){if(Visit(T->data)){if(InOrderTraverse(T->RChild,Visit)){return OK;}}}return ERROR;}else{return OK;} }Status PostOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){if(T){if(PostOrderTraverse(T->LChild,Visit)){if(PostOrderTraverse(T->RChild,Visit)){if(Visit(T->data)){return OK;}}}return ERROR;}else{return OK;} }Status CreatTree(BiTree& T){TElemType ch;T=(BiTree)malloc(sizeof(BiTNode));scanf("%c",&ch);getchar();T->data=ch;if(ch==' '){T->LChild=NULL;T->RChild=NULL;return OK;}printf("輸入%c的左孩子:",ch);CreatTree(T->LChild);printf("輸入%c的右孩子:",ch);CreatTree(T->RChild); }int main(){BiTree T=NULL;printf("輸入root:");CreatTree(T);printf("\nPreOrderTraverse:");PreOrderTraverse(T,Visit);printf("\nInOrderTraverse:");InOrderTraverse(T,Visit);printf("\nPostOrderTraverse:");PostOrderTraverse(T,Visit); }遍歷的樹:
運(yùn)行截圖:
轉(zhuǎn)載于:https://www.cnblogs.com/jiangpengcheng/articles/8075185.html
總結(jié)
以上是生活随笔為你收集整理的实现二叉树的先序遍历、中序遍历、后序遍历的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MPSOC之3——centos环境配置及
- 下一篇: Kncok之绑定事件