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

2021-07-24 10:40:41 字數 1733 閱讀 4620

基於迎春花開365天

利用棧實現二叉樹的先序、中序、後序遍歷的非遞迴操作

以及  alvin-qu

非遞迴,不用棧實現二叉樹中序遍歷  的演算法,本人對二叉樹的遍歷做出系統的總結(c++實現),包含先序、中序、後序的遞迴、棧實現、非遞迴非棧實現。其中以雙棧作為輔助資料結構的後序遍歷演算法,**於jimolangge123

二叉樹的後序遍歷實現(基於兩個棧實現)

先序遍歷的三種演算法:

//遞迴實現先序遍歷

void preordertree(binnode* root)

else

}//非遞迴實現先序遍歷(使用棧作為輔助資料結構)

void preordertree(binnode* root)

while(root||!stack.empty())

root=stack.top();

stack.pop();

root=root->right(); }}

//不使用棧,非遞迴先序遍歷bst

/* *每個節點有個parent指標進行回溯

*/void preordertree(binnode* root)

while(root->left())

while(root!=null)

} elsewhile(root!=null&&temp==root->right());

} }}

中序遍歷:

//遞迴實現中序遍歷

void inordertree(binnode* root)

else

}//非遞迴實現中序遍歷(使用棧作為輔助資料結構)

void inordertree(binnode* root)

while(root||!stack.empty())

root=stack.top();

stack.pop();

coutroot=root->right(); }}

//不使用棧,非遞迴中序遍歷bst

/* *每個節點有個parent指標進行回溯

*/void inordertree(binnode* root)

while(root->left())

while(root!=null)

} elsewhile(root!=null&&temp==root->right());

} }}

後序遍歷:

//遞迴實現後序遍歷

void postordertree(binnode* root)

else

}//非遞迴實現後序遍歷

/**使用雙棧作為輔助資料結構

*/void postordertree(binnode* root)

stack1.push(root);

while(!stack1.empty())

while(!stack2.empty())

}//不使用棧,非遞迴後序序遍歷bst

/* *每個節點有個parent指標進行回溯

*/void postordertree(binnode* root)

while(root->left())

while(root!=null)

} else

while(temp==root->right()||root)

} }}

二叉樹遍歷非遞迴實現(借助棧)

先序遍歷非遞迴實現 思路 使用棧來模擬遞迴的操作 迴圈條件 節點不為null,且棧不為空。如果當前節點不為空,把節點進棧,並且訪問節點 cout 節點指向其左孩子,直至左孩子為空。這時相當於左子樹已經遍歷完了,我們需要訪問右節點,將當前元素指向棧頂元素右孩子,彈出棧頂元素。c void preord...

基於棧的非遞迴方法實現二叉樹

include include include using namespace std struct binode typedef struct binode node typedef node linknode 以先序的順序編寫結點 linknode creattree linknode t el...

用棧實現二叉樹的遍歷(非遞迴)

先實現棧 include include include typedef char elemtype define stacksize 20 typedef struct st stack void init stack stack p 初始化棧 bool is empty stack p 判斷是否...