二叉樹的建立以及遍歷方法

2021-08-04 02:17:27 字數 2339 閱讀 7424

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

在此分別總結先序,中序,後序的結點輸出順序。

先序: 1.訪問根結點

2.訪問左子樹

3.訪問右子樹

先序較簡單,不予以即係解釋。

中序:1.訪問左子樹

2.訪問根結點

3.訪問右子樹

原則:訪問左子樹。【先訪問左子樹中的左子樹,再訪問左子樹中的右子樹。】直到訪問到葉子結點後輸出。

輸出根。

訪問右子樹。【先訪問右子樹中的左子樹,再訪問右子樹中的右子樹。】直到訪問到葉子結點後輸出。

具體步驟如下:

a作為根。從a開始,先訪問a的左子樹。即

在看b的左子樹,d。則輸出d。b無左子樹。訪問完b的左子樹。然後訪問b。輸出b。再看b的右子樹。f有左子樹e,則輸出e。返回輸出f。a的左子樹全部輸出完,再返回a,輸出a。

同理,看a的右子樹。

所以,中序遍歷輸出的結果為:(d b e f)a(g h c i).

後序:1.訪問左子樹

2.訪問右子樹

3.訪問根

原則:訪問左子樹。【先訪問左子樹中的左子樹,再訪問左子樹中的右子樹】。直到訪問到葉子結點後輸出。

訪問右子樹。【先訪問右子樹中的左子樹,再訪問右子樹中的右子樹】。直到訪問到葉子結點後輸出。

再返回訪問根,並輸出。

具體步驟:

先訪問a的左子樹。再訪問左子樹中的左子樹。【即:a的左子樹為b,再訪問b的左子樹d。d沒有左右子樹,輸出d。】,然後訪問左子樹中的右子樹。【即:訪問b的右子樹f,f還有左子樹,再訪問f的左子樹e,e沒有左右子樹。輸出e。再輸出f,再輸出b。】。

然後訪問a的右子樹。再訪問右子樹中的左子樹。【即:a的右子樹為c,再訪問c的左子樹g。g還有右子樹h,輸出h。再輸出g,再輸出g】,然後訪問右子樹中的右子樹。【即:訪問c的右子樹i,i沒有左右子樹,輸出i。在輸出c。再輸出a。】。

所以,後序遍歷輸出結果為:(d e f b)(h g i c)a

**如下:

#include#includeusing namespace std;

// 定義樹結構體

typedef struct _bitree

binode,*bitree;

// 遞迴先序遍歷二叉樹

void preorder(bitree root)

}// 遞迴中序遍歷二叉樹

void inorder(bitree root)

}// 遞迴後序遍歷二叉樹

void postorder(bitree root)

}// 建立二叉樹

void createbitree(bitree *root)

else

(*root)->data = ch;

createbitree(&((*root)->lchild));

createbitree(&((*root)->rchlid)); }}

// 後序遍歷求二叉樹高度的遞迴演算法

int posttreedepth(bitree root)

else }

// 非遞迴先序遍歷二叉樹

void preorder1(bitree root)

else

}}// 非遞迴中序遍歷二叉樹

void inorder1(bitree root)

else

}}// 非遞迴後序遍歷二叉樹

void postorder1(bitree root)

if (!s.empty())

else

} }}

int main(void)

結果如下:

二叉樹建立以及遍歷

題目描述 編乙個程式,讀入使用者輸入的一串先序遍歷字串,根據此字串建立乙個二叉樹 以指標方式儲存 例如如下的先序遍歷字串 abc de g f 其中 表示的是空格,空格字元代表空樹。建立起此二叉樹以後,再對二叉樹進行中序遍歷,輸出遍歷結果。輸入描述 輸入包括1行字串,長度不超過100。輸出描述 可能...

C 二叉樹的建立以及遍歷

在筆試面試的過程中,二叉樹也是難點之一,考的也是比較多的。我也是被這個問題給難倒過,不能在乙個地方摔兩次啊!雖然這個東西第一次寫出來了,可是如果長時間不看不寫不用,還是很容易忘記的。溫故而知新,老子還是很厲害的啊,要謹記老子的話了。廢話不多說,直接上 吧!還是一樣在vc6.0上除錯過的。includ...

二叉樹的建立以及遍歷C C

一 二叉樹的定義 二叉樹 binary tree 是個有限元素的集合,該集合或者為空,或者由乙個稱為根 root 的元素及兩個不相交的 分別被稱為左子樹和右子樹的二叉樹組成。當集合為空時,稱該二叉樹為空二叉樹,在二叉樹中,乙個元素也成為乙個節點。二 二叉樹的資料結構 下面為二叉樹鏈式儲存結構的定義 ...