說明:本文參考網友的實現,如有版權問題,請聯繫我。本文代碼在vs2019下運行通過,不過,測試用例測試很完整。
struct BinaryTreeNode {
public:
BinaryTreeNode(int value) {
value_ = value;
left_ = nullptr;
right_ = nullptr;
}
int value_;
BinaryTreeNode* left_;
BinaryTreeNode* right_;
};
//前序遍歷
void pre_visit_tree_not_recursive(BinaryTreeNode* root) {
if (nullptr == root) {
return;
}
stack<BinaryTreeNode*> s;
BinaryTreeNode* p = root;
while (p || !s.empty()) {
while (p) {
cout << p->value_ << " ";
s.push(p);
p = p->left_;
}
p = s.top();
s.pop();
p = p->right_;
}
}
//前序遍歷v2
void pre_visit_tree_not_recursive_v2(BinaryTreeNode* root) {
if (nullptr == root)
return;
stack<BinaryTreeNode*> s;
BinaryTreeNode* p = root;
while (p || !s.empty()) {
if (nullptr != p) {
cout << p->value_ << " ";
s.push(p);
p = p->left_;
}
else {
p = s.top();
s.pop();
p = p->right_;
}
}
}
//中序遍歷
void middle_visit_tree_not_recursive(BinaryTreeNode* root) {
if (nullptr == root)
return;
stack<BinaryTreeNode*> s;
BinaryTreeNode* p = root;
while (p || !s.empty()) {
while (p) {
s.push(p);
p = p->left_;
}
p = s.top();
cout << p->value_ << " ";
s.pop();
p = p->right_;
}
}
int main()
{
BinaryTreeNode *root = new BinaryTreeNode(10);
BinaryTreeNode *root_l = new BinaryTreeNode(5);
BinaryTreeNode* root_r = new BinaryTreeNode(20);
root->left_ = root_l;
root->right_ = root_r;
BinaryTreeNode* root_l_l = new BinaryTreeNode(3);
BinaryTreeNode* root_l_r = new BinaryTreeNode(7);
root_l->left_ = root_l_l;
root_l->right_ = root_l_r;
//非遞歸遍歷
pre_visit_tree_not_recursive(root);
cout << endl;
pre_visit_tree_not_recursive_v2(root);
cout << endl;
middle_visit_tree_not_recursive(root);
cout << endl;
return 0;
}