其實思路就是遞迴的思路,無非就是加入了棧這個資料結構。首先是結點資料結構的設定:具體來看**吧,個人覺得還算簡潔。
/**
*@author wk
*/public
class
searchbinarytree
- 前序遍歷/**
**@param t 傳入的樹的根結點
*/public
static
void
priorordernonrecursive(searchbinarytree t)
//左孩子不為空且左孩子未被遍歷過(防止重複入棧)
if (p.leftchild != null && p.leftchild.flag == false)
//右孩子不為空且右孩子未被遍歷過(防止重複入棧)
if (p.rightchild != null && p.rightchild.flag == false)
//如果左右孩子都為空則需要出棧。
if (!binarytrees.empty())
p = binarytrees.pop();
else
p = null;}}
- 中序遍歷/**
* 中序遍歷和前序的區別就在於遍歷的位置,也就是輸出tag的位置,其他完全類似
*@param root 傳入的樹的根結點
*/public
static
void
infixordernonrecursive(searchbinarytree root)
if (p.flag == false)
if (p.rightchild != null && p.rightchild.flag == false)
if (!binarytrees.empty())
p = binarytrees.pop();
else
p = null;}}
- 後序遍歷/**
*可以發現其實後序遍歷的**與前兩個也類似,只是遍歷位置不同,由此可見非迴圈遍歷其實也並不難,掌握其中乙個其他的也就掌握了
*@param root
*/public
static
void
postordernonrecursive(searchbinarytree root)
if (p.rightchild != null && p.rightchild.flag == false)
if (p.flag == false)
if (!binarytrees.empty())
p = binarytrees.pop();
else
p = null;}}
以這棵樹為例:
初始化**:
private
static searchbinarytree inittree()
測試:
searchbinarytree root = inittree();
system.out.println("--------前序遍歷開始:");
priorordernonrecursive(root);
system.out.println("--------中序遍歷開始:");
root = inittree();
infixordernonrecursive(root);
system.out.println("--------後序遍歷開始:");
root = inittree();
postordernonrecursive(root);
結果:
--------前序遍歷開始:ab
cdef
g--------中序遍歷開始:cb
edag
f--------後序遍歷開始:ce
dbgf
a
實現之後發現靜下心來思考的話這個問題並不難,說明對其他事物來講也應該這樣,靜心下來去做。
二叉樹三種遍歷方式非遞迴實現
1.中序遍歷 應為輸出的子樹根的關鍵字位於其左子樹關鍵字值和右子樹的關鍵字值之間 同理,先序後序遍歷。1.先序遍歷非遞迴演算法 define maxsize 100 typedef struct sqstack void preorderunrec bitree t endwhile if stac...
二叉樹的三種非遞迴遍歷
一.前序遍歷 前序遍歷按照 根結點 左孩子 右孩子 的順序進行訪問。1.遞迴實現 void preorder1 bintree root 遞迴前序遍歷 2.非遞迴實現 根據前序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,因此可以直接訪問,訪問完之後...
二叉樹的三種非遞迴遍歷
遞迴演算法和非遞迴演算法的轉換 可以借助棧,將二叉樹的遞迴演算法轉換為非遞迴演算法,下面以中序遍歷為例給出中序遍歷的非遞迴演算法。先掃瞄 並非訪問 根結點的所有左結點並將他們一一進棧。然後出戰乙個結點 p 顯然結點 p沒有左孩子結點或者左孩子結點均已訪問過 則訪問它。然後掃瞄該結點的有孩子結點,將其...