資料結構 二叉樹的基本操作(二)

2021-09-29 03:54:19 字數 4067 閱讀 5116

1.理解二叉樹的基本概念和特點

2.掌握二叉樹的鏈式儲存結構

3.掌握二叉樹的基本操作

4.掌握二叉樹遍歷操作

1.實現二叉樹的如下操作,先序遍歷、中序遍歷和後序遍歷的遞迴演算法,二叉樹如下圖所示。(採用二叉鏈儲存結構實現)

(1)採用括號表示法,構建如下二叉樹,並輸出二叉樹b;

(2)採用遞迴演算法,輸出二叉樹的先序序列;(參考課本212頁**)

(3)採用遞迴演算法,輸出二叉樹的中序序列;

(4)採用遞迴演算法,輸出二叉樹的後序序列;

2.實現上述二叉樹的先序遍歷的演算法。

(一)先、中、後序遍歷遞迴思路與寫法:

1. 先、中、後序遍歷遞迴思路

先序遍歷:先遍歷根節點,再遍歷左子樹,再遍歷右子樹,所以最先輸出根節點;

中序遍歷:先遍歷根節點左子樹,再遍歷根節點,再遍歷右子樹;

後序遍歷:先遍歷左子樹,再右子樹,最後根節點。

2.遞迴演算法的基本操作函式以及主函式(詳細**見附錄):(1

) 建立二叉樹createbtnode

(*b,

*str):根據二叉樹括號表示法字串str生成對

應的二叉鏈儲存結構,後者的根結點為*b。(2

) 輸出二叉樹dispbtnode

(btnode *b):以括號表示法輸出一棵二叉樹。(3

) 銷毀二叉樹destroybtnode

(btnode *

&b):銷毀二叉樹b。(4

) 先序遍歷遞迴演算法preorder

(btnode * b)(5

) 中序遍歷遞迴演算法inorder

(btnode * b)(6

) 後序遍歷遞迴演算法postorder

(btnode * b)(7

)主函式main():根據問題依次呼叫基本操作函式並編寫通俗易懂的語句輸出。

(二) 先序遍歷非遞迴方法的基本思路與演算法:

1. 先序遍歷非遞迴方法的基本思路:

利用棧先輸出當前節點(根),然後將所以其左節點壓到棧中,方便後面出棧來處理其的右節點,然後把當前的物件指標指到其左節點(左),然後 while 判斷指標不為空,所以繼續將其輸出,然後移到其左節點,直到沒有左節點了,通過出棧開始處理右節點(右)。

2.非遞迴演算法的基本操作函式以及主函式(詳細**見附錄):(1

) 建立二叉樹createbtnode

(*b,

*str):根據二叉樹括號表示法字串str生成對

應的二叉鏈儲存結構,後者的根結點為*b。(2

) 輸出二叉樹dispbtnode

(btnode *b):以括號表示法輸出一棵二叉樹。(3

) 銷毀二叉樹destroybtnode

(btnode *

&b):銷毀二叉樹b。(4

) 初始化棧initstack

(sqstack *

&s)(

5) 銷毀棧destroystack

(sqstack *

&s)(

6) 判斷棧是否為空stackempty

(sqstack *s)(7

) 進棧push

(sqstack *

&s,btnode *e)(8

) 出棧pop

(sqstack *

&s,btnode *

&e)(

9) 取棧頂元素gettop

(sqstack *s,btnode *

&e)(

10) 先序遍歷非遞迴演算法preorder2

(btnode *b)(11

)主函式main():根據問題依次呼叫基本操作函式並編寫通俗易懂的語句輸出。

(一)遞迴演算法的執行結果如下:

(二)非遞迴演算法的執行結果如下:

二叉樹的遍歷是指按照一定次序訪問樹中所有節點,並且每個節點僅被訪問一次的過程。遍歷操作實際上是將非線性結構線性化的過程,其結果為線性序列,並根據採用的遍歷順序分別稱為先序序列、中序序列、後序序列。

#include

#include

#define maxsize 100

typedef

char elemtype;

typedef

struct node

btnode;

void

createbtnode

(btnode *

&b,char

*str)

//由str串建立二叉鏈}}

j++; ch=str[j];}

}void

dispbtnode

(btnode *b)

//以括號表示法輸出二叉樹}}

void

destroybtnode

(btnode *

&b)//銷毀二叉樹

}void

preorder

(btnode * b)

//先序遍歷遞迴演算法

}void

inorder

(btnode * b)

//中序遍歷遞迴演算法

}void

postorder

(btnode * b)

//後序遍歷遞迴演算法

}int

main()

btree.cpp

#include

#include

#define maxsize 100

typedef

char elemtype;

typedef

struct node

btnode;

void

createbtnode

(btnode *

&b,char

*str)

//由str串建立二叉鏈}}

j++; ch=str[j];}

}void

dispbtnode

(btnode *b)

//以括號表示法輸出二叉樹}}

void

destroybtnode

(btnode *

&b)}

think1.cpp

#include

"btree.cpp"

typedef

struct

sqstack;

//順序棧型別

void

initstack

(sqstack *

&s)//初始化棧

void

destroystack

(sqstack *

&s)//銷毀棧

bool stackempty

(sqstack *s)

//判斷棧是否為空

bool push

(sqstack *

&s,btnode *e)

//進棧

bool pop

(sqstack *

&s,btnode *

&e)//出棧

bool gettop

(sqstack *s,btnode *

&e)//取棧頂元素

void

preorder2

(btnode *b)

//先序遍歷非遞迴演算法

//以下考慮棧頂結點if(

!stackempty

(st)

)//若棧不空

}printf

("\n");

destroystack

(st)

;//銷毀棧

}int

main()

資料結構 二叉樹鏈結結構基本操作

二叉樹順序儲存的優缺點 順序儲存結構就是使用陣列來儲存,順序結構操作比較簡單,對於堆結構來說,適合使用順序儲存方式來解決。但陣列只適合表示完全二叉樹,對於一般的二叉樹如果採用順序儲存方式會造成大量的空間浪費,這是我們不希望看到的。由此引出來二叉樹的鏈式儲存。並實現二叉樹的以下操作 建立二叉樹 拷貝二...

資料結構 二叉樹基本操作 二叉樹面試題

二叉樹的基本概念就不多說了 如下 binarytree.c pragma once include include include include typedef char btdatatype typedef struct binarytreenode btnode a是乙個前序遍歷的陣列 二叉樹...

資料結構 二叉樹的基本操作(一)

1.理解二叉樹的基本概念和特點 2.掌握二叉樹的鏈式儲存結構 3.掌握二叉樹的基本操作 1.實現二叉樹的如下操作,二叉樹如下圖所示。採用二叉鏈儲存結構實現 1 輸出二叉樹b 2 輸出c節點的左 右孩子節點值 3 輸出二叉樹的深度 4 輸出二叉樹b的節點個數 5 輸出二叉樹b的葉子節點個數。根據題目為...