作為一名大四學生,進來複習資料結構,對二叉樹這一部分重新進行了複習與整理,由於第一次寫技術部落格,不對的地方還望諸君指正。
接下來我們進入主題,那就是基於嚴蔚敏的資料結構的二叉樹的建立,遍歷說說自己的理解。
首先我們來看二叉樹的定義:是n(n≥0)個結點的有限集合,由乙個根結點以及兩棵互不相交的、分別稱為左子樹和右子樹的二叉樹組成。從定義中我們能夠看出二叉樹的定義具有遞迴性,即每乙個節點下又是一顆二叉樹。因此我們首先來講解次用遞迴的形式建立二叉樹的adt,即如下部分:
首先給出二叉樹的資料結構,即有乙個字元表示的資料域data,和作為二叉樹的左孩子和右孩子指標域btree*:
typedef struct btree;
接下來給出建立二叉樹的抽象資料型別:
status createtree(btree* *t)
else
(*t)->data = ch;//先申請空間後分配
createtree(&((*t)->lchild));//左子樹
createtree(&((*t)->rchild));//右子樹
} return ok;
}
這裡指的說明的是此處createtree中傳入的引數是乙個二級指標,用於存放每個節點位址。接下來輸入資料,在這裡規定當輸入的字元是空格時該節點制空,即在還節點下沒有子樹。這裡的*t即表示乙個節點,這個一級指標用來儲存樹的資料結構,如果輸入的字元不是空,同時允許記憶體空間分配的前提下,將該節點的資料域賦值,接下來將其左孩子遞迴,直至其子孫的最左側的左孩子沒有子孫,則遞迴的去建立該節點的右孩子,依次遞迴,進而建立整顆樹。
接下來就是對二叉樹的先序遍歷,中序遍歷,和後序遍歷。既然二叉樹的定義具有遞迴性那麼這三種遍歷這裡依然用到了遞迴。首先給出先序遍歷的adt:
status dlr(btree *t)
return ok;
}
然後是中序遍歷:status ldr(btree *t)
return ok;
}
最後是後序遍歷:
status lrd(btree *t)
return ok;
}
從**中不難看出這三種遍歷的區別僅僅在於輸出位置的不同,先序遍歷在於在訪問該節點時即將它的指標域進行輸出,中序遍歷則在其左孩子節點為空時才輸出它的資料域,而後序遍歷則是在右孩子的節點為空時輸出它的資料域。
最後我們再來講解一下二叉樹的層次遍歷,首先我們給出層次遍歷的**:
void levelorder(btree *t)
if(p->rchild != null) }
}
正如**中的注釋中闡述的一部分可見二叉樹的層次遍歷的端倪,我們來簡單分析一下過程,首先我們知道層次遍歷用到佇列,這裡我們用陣列模擬了迴圈佇列,分別用兩個變數記錄佇列的下標分別為rear和front,表示後向指標和前向指標,指向-1的下標即該隊列為空。接下來後向指標指向佇列的首元素,將樹的跟節點入隊。在佇列不為空的前提下,依次將隊頭出隊同時將有左孩子或右孩子的的加點進入佇列。直至最終訪問完每乙個節點。
接下來給出全部的原始碼:
#include#include#includeusing namespace std;
typedef int status;
#define ok 1
#define maxsize 100
typedef struct btree;
status createtree(btree* *t)
else
(*t)->data = ch;
createtree(&((*t)->lchild));
createtree(&((*t)->rchild));
} return ok;
}status dlr(btree *t)
return ok;
} status ldr(btree *t)
return ok;
}status lrd(btree *t)
return ok;
}void levelorder(btree *t)
if(p->rchild != null) }}
int main(){
btree *t = (btree*)malloc(sizeof(btree));
createtree(&t);
cout<
樣例輸入:
a b c d e g f
執行結果:
複習 二叉樹 樹
樹是一種很常用的資料結構,日後的學習中會經常碰到運用樹的知識。構造二叉樹 include include include using namespace std 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹 1 若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值 2 若右子樹不空...
複習二叉樹之線索二叉樹
include 線索二叉樹是在遍歷的過程中線索化 typedef struct bithrnodebithrnode,bithrtree bithrtree pre 全域性變數 建立二叉鍊錶 先序遍歷建立 關鍵在於 表明空樹 void createbitree bithrtree a else 為什...
8 二叉樹複習
構建二叉樹 左子結點小於根節點,右子結點大於根節點 二叉樹 public class binarytree,value 向樹中新增元素key value public void put key key,value value 向指定的樹x中新增key value,並返回新增元素後新的樹 privat...