二叉樹的實現, 遍歷 遞迴, 非遞迴, 層序

2021-10-06 11:35:11 字數 2378 閱讀 1427

#include

"binarytree.h"

#include

"stack.h"

#include

"queue.h"

// 通過前序遍歷的陣列"abd##e#h##cf##g##"構建二叉樹

btnode*

binarytreecreate

(btdatatype* str,

int* idx)

else

}// 二叉樹銷毀

void

binarytreedestory

(btnode*

* root)

// 二叉樹節點個數

intbinarytreesize

(btnode* root)

//非遞迴寫法

//遍歷結點, 累加計數器

void

binarytreesize2

(btnode* root,

int* num)

// 二叉樹葉子節點個數

intbinarytreeleafsize

(btnode* root)

// 二叉樹第k層節點個數

intbinarytreelevelksize

(btnode* root,

int k)

// 二叉樹查詢值為x的節點

btnode*

binarytreefind

(btnode* root, btdatatype x)

// 二叉樹前序遍歷

//遞迴

void

binarytreeprevorder

(btnode* root)

//非遞迴

//前序 : 先訪問, 再入棧, 出棧拿右子樹

void

binarytreeprevordernor

(btnode* root)

//左子樹沒有值之後,, 通過獲取棧頂元素訪問右子樹結點

//從棧中獲取的棧頂結點, 都是訪問過本身和左子樹的, 只剩下右子樹沒有訪問

btnode* top =

getstacktop

(&st)

;//刪除棧頂元素

stackpop

(&st)

; cur = top->_right;

}printf

("\n");

}// 二叉樹中序遍歷

void

binarytreeinorder

(btnode* root)

//非遞迴

//中序 : 先入棧, 出棧時訪問, 並拿到右子樹

void

binarytreeinordernor

(btnode* root)

//左子樹沒有值之後,, 通過獲取棧頂元素訪問右子樹結點

//從棧中獲取棧頂結點,都是訪問完左子樹的, 接下來訪問該節點

btnode* top =

getstacktop

(&st)

;//刪除棧頂元素

stackpop

(&st)

;printf

("%c "

, top->_data)

; cur = top->_right;

}printf

("\n");

}// 二叉樹後序遍歷

void

binarytreepostorder

(btnode* root)

//非遞迴

//後序 : 需要判斷棧頂元素的右子樹是否訪問完成

void

binarytreepostordernor

(btnode* root)

//獲取棧頂元素

top =

getstacktop

(&st)

;//拿到棧頂元素之後要判斷 top的右子樹是否訪問完成

if(top->_right ==

null

|| top->_right == prev)

else

}printf

("\n");

}// 層序遍歷

void

binarytreelevelorder

(btnode* root)

printf

("\n");

}// 判斷二叉樹是否是完全二叉樹

intbinarytreecomplete

(btnode* root)

else

}//檢查佇列中剩餘元素是否全是空

while

(queueempty

(&q)!=1

)return1;

}

二叉樹遍歷 遞迴 非遞迴實現

先序遍歷中序遍歷 後序遍歷 根結點 左子樹 右子樹 左子樹 根子樹 右子樹 左子樹 右子樹 根結點 先序遍歷 void preorder btree t 中序遍歷 void inorder btree t 後序遍歷 void postorder btree t 遞迴 recursion 就是子程式 ...

二叉樹系列 3 層序遍歷的非遞迴實現

按照層次序實現二叉樹遍歷。對於上圖中的二叉樹,層次遍歷的實現結果如下 層次遍歷的過程天然地符合佇列這個資料結構,因此可以用佇列方法來非遞迴地實現層次遍歷。目前還不太清楚如何遞迴地實現層次遍歷,網上看到的一些解法,聲稱採用了遞迴方法進行層次遍歷,但是它們是在while迴圈中進行的遞迴,是一種偽遞迴。由...

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...