BST 遍历

递归遍历

pre_order

// 递归先序遍历  
void rpre_order(btree* tree) {  
    btNode * p = tree;  
    if (NULL == p) {  
        return;  
    }  
    cout << p->data << "  ";  
    rpre_order(p->left);  
    rpre_order(p->right);  
}  

pos_order


// 递归后续遍历  
void rpost_order(btree* tree) {  
    btNode* p = tree;  
    if (NULL == p)  
        return;  
    rpost_order(p->left);  
    rpost_order(p->right);  
    cout << p->data << "  ";  
}  

in_order

// 递归中序遍历  
void rin_order(btree* tree) {  
    btNode* p = tree;  
    if (NULL == p)  
        return;  
    rin_order(p->left);  
    cout << p->data << "  ";  
    rin_order(p->right);  

}  

非递归遍历

pre

// 非递归前序遍历  
void pre_order(btree* tree) {  
    btNode * p = tree;  
    if (NULL == p)  
        return;  

    stack<btNode*>* st = new stack<btNode*>();  
    st->push(p);  
    while (!st->empty()) {  
        p = st->top();  
        st->pop();  
        cout << p->data << "  ";  
        if (NULL != p->right) {  
            st->push(p->right);  
        }  
        if (NULL != p->left) {  
            st->push(p->left);  
        }  
    }  
    delete st;  
}  

pos

// 非递归后续遍历  
//需要注意的是 : 非递归<strong>后序</strong>遍历方法相对实现比较困难,主要原因就在于父子节点访问缺乏连续  
//              解决思路是将前一个访问节点记忆下来,并判断和当前节点之间的关系再做处理  
void post_order(btree* tree) {  

    btNode* curr = tree;  // 记录当前执行的节点  
    btNode* prev = NULL; // 记录前一个访问的节点  
    if (NULL == curr) {  
        return;  
    }  
    stack<btNode*>* st = new stack<btNode*>();  
    st->push(curr);  
    while (!st->empty()) {  
        curr = st->top();  
        // 如果该节点没有孩子节点则可以直接访问  
        if (NULL == curr->left && NULL == curr->right) {  
            cout << curr->data << "  ";  
            st->pop();  
            prev = curr;  
            continue;  
        }  
        // 如果该节点的孩子节点已经被访问过了,也可直接访问  
        if (NULL != prev && (prev == curr->right || prev == curr->left)) {  
            cout << curr->data << "  ";  
            st->pop();  
            prev = curr;  
            continue;  
        }  

        // 除了上述情况则需要将孩子节点入栈  
        if (NULL != curr->right) {  
            st->push(curr->right);  
        }  
        if (NULL != curr->left) {  
            st->push(curr->left);  
        }  
    }  

    delete st;  
}  

in

// 非递归中序遍历  
void in_order(btree* tree) {  
    btNode* p = tree;  
    if (NULL == p)  
        return;  

    stack<btNode*>* st = new stack<btNode*>();  
    while (NULL != p || !st->empty()) {  
        while (NULL != p) {  
            st->push(p);  
            p = p->left;  
        }  
        if (!st->empty()) {  
            p = st->top();  
            st->pop();  
            cout << p->data << "  ";  
            p = p->right;  
        }  
    }  
    delete st;  
}  

逐层遍历

广度优先

void bfs_order(btree* tree) {  
    btNode* p = tree;  
    if (NULL == p) {  
        return;  
    }  

    queue<btNode*> * qu = new queue<btNode*>();  
    qu->push(p);  

    while (!qu->empty()) {  
        p = qu->front();  
        qu->pop();  
        cout << p->data << "  ";  
        if (NULL != p->left) {  
            qu->push(p->left);  
        }  
        if (NULL != p->right) {  
            qu->push(p->right);  
        }  
    }  
    delete qu;  
}  

销毁二叉树

void destory_btree(btree* tree) {  
    btNode* p = tree;  
    if (NULL == p) {  
        return;  
    }  

    queue<btNode*> * qu = new queue<btNode*>();  
    qu->push(p);  

    while (!qu->empty()) {  
        p = qu->front();  
        qu->pop();  
        if (NULL != p->left) {  
            qu->push(p->left);  
        }  
        if (NULL != p->right) {  
            qu->push(p->right);  
        }  
        free(p);  
    }  
    delete qu;  
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值