二叉樹的建立與遍歷 遞迴與非遞迴(九)

2021-09-02 11:49:08 字數 1705 閱讀 6151

18.12.2

(基於c語言,歡迎指正)

關於二叉樹,我們知道,它的每個結點最多只有兩棵子樹,是一種很實用很重要很常見的樹,一些基本的性質就不廢話了,先從二叉樹結點設定說起,我們這裡用鏈式來實現

每個結點有乙個資料域和兩個指標域,資料域用來放你想掛在樹上的東西的,這裡我們設為字元型char,而兩個指標域,乙個指向左子樹,乙個指向右子樹

typedef char elemtype;//定義char是elemtype

typedef struct binodebinode,*bitree;//*bitree是二叉樹結點的結構體指標,一般傳入函式的引數就用的是它的位址

我這裡用的是先序序列來初始化一棵樹,即按照根左右的順序,每遇到乙個根結點,就對其做相應的訪問,然後在對左子樹做處理,最後才是右子樹,

注意這裡傳入的是結點的位址的位址,通過在位址的位址層上修改結點位址,有點繞口,比如說我們定義乙個整型變數 int e; 然後想通過指標修改它的值,我們設定乙個函式###(int *e),然後我們呼叫函式的時候要寫###(&e),乙個道理,只不過我們底下的t在一開始就是位址而不是像e一樣是乙個普通的值

void createbitree(bitree *t)//建立一棵樹,傳入樹的結點的位址的位址

}

我們按先序(根左右)遞迴舉例,**很短很簡單,但效率不高畢竟遞迴嘛,如果我們要寫中序的遞迴,就把 printf 那句挪到 preorder(t->lchild) 底下就行了,後序就再往下挪一行,總之按照他們的遍歷方法來決定

void preorder(bitree t)
我們還是按照先序來寫

思路是這樣:我們先有一棵樹,然後還有乙個棧,從根結點開始,對訪問的每乙個根結點先進行相應操作(畢竟是先序,根!左右嘛,先根後左右),然後把該根結點入棧,接下來訪問左子樹,於是我們就不斷往左邊走,一直到最左邊停下來,發現此時左子樹為空了,然後從棧中pop乙個結點,訪問它的右子樹的根結點,並以該根結點開始繼續不斷向左

思路就是這樣

棧!其實吧,棧不一定是要像之前我們那樣設個結構體然後有指標指來指去什麼的,其實,棧是一種形式,一種方法,一種資料結構,就是本著先進後出的原則,這裡我們用乙個簡單的陣列來實現棧

void pre(bitree t)

else}}

//二叉樹鏈式儲存實現

#include#includetypedef char elemtype;//定義char是elemtype

typedef struct binodebinode,*bitree;

void createbitree(bitree *t)//建立一棵樹,傳入樹的結點的位址的位址

二叉樹的遞迴遍歷與非遞迴遍歷

二叉樹的遞迴遍歷與非遞迴遍歷 include include include 本程式實現二叉樹的建立,遞迴遍歷與非遞迴遍歷 typedef struct tnode tnode,pnode 構造二叉樹 pnode createtree else pnode data data pnode lchil...

二叉樹的遞迴遍歷與非遞迴遍歷

二叉樹的遍歷有遞迴與非遞迴兩種方式,但思想大致相同 前序 先列印然後遍歷完他的左子樹,左子樹為空時開始返回,並且開始以棧中元素為根遍歷右子樹 中序 先遍歷左子樹然後左子樹入棧,左子樹為空再列印,再遍歷右子樹 後序 先遍歷完左子樹,左子樹入棧儲存,再遍歷右子樹,遍歷完列印,否則繼續入棧 遞迴遍歷 遞迴...

二叉樹的遞迴與非遞迴遍歷

規則 根左右 遞迴前序遍歷 void preorder bintree root 非遞迴前序遍歷 思路 1 訪問結點p,並將結點p入棧,輸出p節點的值 2 判斷結點p的左孩子是否為空,若為空,則取棧頂結點並進行出棧操作,並將棧頂結點的右孩子置為當前的結點p 若不為空,則將p的左孩子置為當前的結點p ...