【数据结构基础笔记】【树】
代碼參考《妙趣橫生的算法.C語言實現(xiàn)》
文章目錄
- 前言
- 1、樹的概念
- 2、二叉樹
- 3、二叉樹的遍歷
- 4、創(chuàng)建二叉樹
- 5、實例分析
前言
本章總結:樹的概念、二叉樹的創(chuàng)建、遍歷
1、樹的概念
樹結構是以分支關系定義得一種層次結構。
樹的定義:樹是由n(n>=0)個結點組成的有窮集合。在任意的一棵非空樹中:
1、有且僅有一個稱為根(root)的結點
2、當n>1時,其余的結點分為m(m>0)個互不相交的有限集合T1,T2,T3,…Tm.其中每個集合本身又是一棵樹,并稱為跟的子樹(SubTree)
以上圖為例,A是root,BCD是A的child,以BCD為根節(jié)點構成3棵樹,為A的字·SubTree。
樹的存儲形式:多重鏈表,在多重鏈表中每個結點由一個數(shù)據(jù)域和若干個指針域組成,其中每個指針域指向該結點的一個孩子結點。
多重鏈表結點類型描述:
在利用多重鏈表表示樹結構時分定長結點(每個結點的指針域個數(shù)固定)和不定長結點(每個結點的指針域個數(shù)不固定)
對于二叉樹來說,一個結點至多可以有左右兩個孩子結點,或者只有一個孩子結點,或者沒有孩子結點。
T是一個指針,指向二叉樹的根結點。只有得到T,才能訪問整個樹結構。
2、二叉樹
二叉樹的遞歸定義:二叉樹是這樣的樹結構,它或者為空,或者由一個根結點加上兩棵分別稱為左子樹和右字數(shù)的互不相交的二叉樹組成。
二叉樹結點有三個域,lchild、rchild為指針域,用來指向該結點的左孩子和右孩子。data是數(shù)據(jù)域,用來存放該結點中包含的數(shù)據(jù)。
//二叉樹結點定義 typedef struct BiTNode {ElemType data;struct BiTNode* lchild, * rchild; }BiTNode,*BiTreee; //二叉樹結點類BiTNode,二叉樹每個結點都屬于該類型 //BiTree是一個指向BiTNode類型數(shù)據(jù)的指針3、二叉樹的遍歷
從一個結點(一般來說是根結點)出發(fā),按一定規(guī)律訪問二叉樹的全部結點,每個結點只訪問一次。
應用二叉樹遞歸地邏輯特性,采用遞歸方法遍歷二叉樹。
1、先序遍歷
1、訪問根結點
2、先序遍歷左子樹
3、先序遍歷右子樹
2、中序遍歷
1、中序遍歷左子樹
2、訪問根結點
3、中序遍歷右子樹
//定義visit函數(shù) //訪問結點,輸出結點的層數(shù) void visit(char c) {printf("%c is at %d the level of BiTree\n"); } //**********************遍歷二叉樹*********************// //先序遍歷 void PreOrderTraverse(BiTreee T) {if (T) //遞歸結束條件,T為空{visit(T->data); //訪問根結點PreOrderTraverse(T->lchild); //先序遍歷左子樹PreOrderTraverse(T->rchild); //先序遍歷右子樹} } //中序遍歷 void InOrderTraverse(BiTreee T) {if (T) //遞歸結束條件,T為空{InOrderTraverse(T->lchild); //先序遍歷左子樹visit(T->data); //訪問根結點InOrderTraverse(T->rchild); //先序遍歷右子樹} } //后序遍歷 void PosOrderTraverse(BiTreee T) {if (T) //遞歸結束條件,T為空{PosOrderTraverse(T->lchild); //先序遍歷左子樹PosOrderTraverse(T->rchild); //先序遍歷右子樹visit(T->data); //訪問根結點} }4、創(chuàng)建二叉樹
借鑒二叉樹的遍歷算法也可以逐個生成結點,從而創(chuàng)建出一個二叉樹。
//先序創(chuàng)建一棵二叉樹 void CreateBiTree(BiTreee* T) {char c;scanf("%c",&c);if (c == ' ') *T = NULL;else{*T = (BiTNode *)malloc(sizeof(BiTNode)); //創(chuàng)建根結點(*T)->data = c; //向根結點中輸入數(shù)據(jù)CreateBiTree(&((*T)->lchild)); //遞歸地創(chuàng)建左子樹CreateBiTree(&((*T)->rchild)); //遞歸地創(chuàng)建右子樹} } //依次輸入:ABC D E F // //空格是遞歸結束的標志,當創(chuàng)建到葉子結點時,因為葉子結點的左右子樹都為空,因此要輸入空格表示結束。在創(chuàng)建二叉樹的過程中,程序總是按照:創(chuàng)建根結點-創(chuàng)建左子樹-創(chuàng)建右子樹順序進行5、實例分析
用先序創(chuàng)建一棵樹,并輸出每個字符位于二叉樹的層數(shù)
效果:
結果顯然對的,并且能夠顯示出三種遍歷方式的具體遍歷過程
總結
以上是生活随笔為你收集整理的【数据结构基础笔记】【树】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 许昌看不孕不育比较好的医院推荐
- 下一篇: 地下城 异界 好打吗