樹是一種有層次的資料集合,資料之間的關係是非線性。
特點是:除了根節點外其他結點都有唯一前驅,所有結點都有零個或者多個後驅。
二叉樹:
每個結點至多有兩棵子樹。
儲存方式:
順序儲存結構:
typedef
int datatype;
const
int maxsize=
1000
;//指路建立法
struct bittree
//false插入失敗,true插入成功
bool
inserttree
(char str[
],datatype newone)
for(
int i=
0;i(str[i]
=='r')}
data[root]
=newone;
return
true;}
//先序遍歷
void
preorder
(int root)
//中序遍歷
void
inorder
(int root)
//後序遍歷
void
postorder
(int root)
};
鏈式儲存結構:
typedef
int datatype;
struct nodes
;struct bittree
//插入二叉樹
bool
inserttree
(char str[
],datatype newone)
nodes *temp=head;
for(
int i=
0;i1;i++)if
(str[i]
=='r')}
nodes* ano=
(nodes*
)malloc
(sizeof
(nodes));
ano-
>data=newone;
ano-
>left=
null
; ano-
>right=
null;if
(str[l-1]
=='l'
)temp-
>left=ano;
if(str[l-1]
=='r'
)temp-
>right=ano;
return
true;}
//先序遍歷
void
preorder
(nodes* temp)
//非遞迴的先序遍歷
//輸出當前結點,將當前結點放入棧中
//當左子樹為空時,輸出棧頂結點地右子樹
void
preorder2
(nodes* temp)
else}}
}//中序遍歷
void
inorder
(nodes* temp)
//非遞迴地中序遍歷
//先進左子樹,輸出左子樹,將當前結點放入棧中
//當左子樹為空時,輸出棧頂結點,並進入其右子樹
void
inorder2
(nodes* temp)
else}}
}//後序遍歷
void
postorder
(nodes* temp)
//非遞迴後序遍歷
//記錄訪問過的結點
void
postorder2
(nodes* temp)
else
else}}
}//層次遍歷
void
levelorder
(nodes* temp)}}
;
二叉樹的遍歷:
先序(前序)遍歷:根----左-----右
中序遍歷:左----根-----右
後序遍歷:左----右-----根
這三種可以使用遞迴實現,也可採用非遞迴實現。實現見上面**。採用非遞迴實現時,要使用棧,其中後序遍歷最難,當在右子樹為空或者右子樹遍歷完時,才能訪問(列印)結點,右子樹遍歷完需要用標記標誌。
層次遍歷:按層遍歷
層次遍歷需要借助佇列
這棵二叉樹的先序遍歷是:f-c-a-d-b-e-h-g-m
中序遍歷是:a-c-b-d-f-h-e-m-g
後序遍歷是:a-b-d-c-h-m-g-e-f
層次遍歷:f-c-e-a-d-h-g-b-m
資料結構 (六) 樹和二叉樹
這一章真滴是超級超級的難,本來遞迴就不會,現在又把指標和遞迴搞在一起,太難為人了,特別是二叉樹那個地方,前序中序後序層序,非遞迴的方法實在是令人費解。因此我的部落格也只是羅列了一些主要的知識點,具體的知識還是要看課本的。樹的遍歷 樹的前序遍歷操作定義為 若樹為空,不進行遍歷 否則 訪問根結點 按照從...
資料結構 樹和二叉樹
第一節 二叉樹的定義與基本操作 定義 我們把滿足以下兩個條件的樹型結構叫做二叉樹 binary tree 1 每個結點的度都不大於2 2 每個結點的孩子結點次序不能任意顛倒。由定義得出 二叉樹的每個結點只能含有0 1或2個孩子,且有左右之分。1 二叉樹的五種基本形態 2 二叉樹性質 性質1 二叉樹第...
資料結構 樹和二叉樹
定義 二叉樹是n n 0 個節點的有限集合,該集合或者為空集 稱為空二叉樹 或者由乙個根節點和兩棵互不相交的 分別稱為根節點的左子樹和右子樹的二叉樹組成。特點 每個節點最多有兩棵子樹 二叉樹是有序的,其次序不能任意顛倒 斜樹 1.所有節點都只有左子樹的二叉樹稱為左斜樹 2.所有節點都只有右子樹的二叉...