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的葉子節點個數。根據題目為...