二叉樹系列-3-非遞歸遍歷二叉樹

說明:本文參考網友的實現,如有版權問題,請聯繫我。本文代碼在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;
}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章