#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 ...