再谈二叉树:三种遍历六种实现

二叉树的遍历:前序、中序’后序,其实,是以根节点的访问顺序来确定的,具体看下面:

//记法:根节点的遍历顺序就是树的遍历顺序
    /************************************************************************/
    // V --访问根节点
    // L --遍历左子树
    // R -- 遍历右子树
    // VLR--前序遍历   //注意V的位置
    // LVR --中序遍历
    // LRV --后序遍历
    /************************************************************************/

,下面是代码:

//二叉搜索树
template<typename T> class BSTNode {
public:
    BSTNode():left(0),right(0) {}
    BSTNode(const T & el, BSTNode* l = 0, BSTNode* right = 0) :key(el), left(l), right(r) {}
    T key;
    BSTNode<T>  *left, *right;
public:
    //查找函数
    T* search(BSTNode<T>* p, const T& el)const {
        while (p != NULL)
        {
            if (el == p->key) {
                return &p->key;
            }
            else if (el < p->key) {
                p = p->left;
            }
            else {
                p = p->right;
            }
        }
        return 0;
    }

    //广度优先遍历
    void breadthFirst(BSTNode<T>* root) {
        queue<BSTNode<T>*> nodes;
        BSTNode<T>* p = root;
        if (p != NULL) {
            nodes.push(p);
            while (!nodes.empty())
            {
                p = nodes.front();
                nodes.pop();
                cout << p->key << endl;
                if (p->left != 0) {
                    nodes.push(p->left);
                }
                if (p->right != 0) {
                    nodes.push(p->right);
                }
            }
        }
    }

    void visit(BSTNode<T>* node)const {
        cout << node->key << endl;
    }
    //记法:根节点的遍历顺序就是树的遍历顺序
    /************************************************************************/
    // V --访问根节点
    // L --遍历左子树
    // R -- 遍历右子树
    // VLR--前序遍历   //注意V的位置
    // LVR --中序遍历
    // LRV --后序遍历
    /************************************************************************/

    //中序遍历
    void inorder(BSTNode<T>* p) {
        if (p != NULL) {
            inorder(p->left);
            visit(p);
            inorder(p->right);
        }
    }
    /************************************************************************/
    /* 中序遍历 非递归实现                                                                     */
    /************************************************************************/
    void iterativeInorder(BSTNode<T>* root) {
        stack<BSTNode<T>*> travStack;
        BSTNode<T> *p = root;
        while (p != 0) {
            if (p->right) {
                travStack.push(p->right);
            }
            travStack.push(p);
            p = p->left;
        }

        p = travStack.pop();
        while (!travStack.empty()) {
            visit(p);
            p = travStack.pop();
        }

        visit(p);
        if (!travStack.empty()) {
            p = travStack.pop();
        }
        else {
            p = 0;
        }
    }


    //前序遍历
    void preorder(BSTNode<T>* p) {
        if (p != NULL) {
            visit(p);
            inorder(p->left);
            inorder(p->right);
        }
    }
    /************************************************************************/
    /*      前序遍历 非递归实现                                                                */
    /************************************************************************/
    void iterativePreorder(BSTNode<T>* root) {
        stack<BSTNode<T>*> travStack;
        BSTNode<T>* p = root;
        if (p != NULL) {
            travStack.push(p);
            while (!travStack.empty())
            {
                p = travStack.pop();
                visit(p);
                if (p->right != 0) {
                    travStack.push(p->right);
                }
                if (p->left != 0) {
                    travStack.push(p->left);
                }
            }
        }
    }
    //后序遍历
    void postorder(BSTNode<T>* p) {
        if (p != NULL) {
            inorder(p->left);
            inorder(p->right);
            visit(p);
        }
    }

    /************************************************************************/
    /* 后序遍历 非递归实现                                                                     */
    /************************************************************************/
    void iterativePostorder(BSTNode<T>* root) {
        stack<BSTNode<T>*> travStack;
        BSTNode<T>  *p = root, *q = root;
        while (p != 0){
            for (;p->left != 0;p = p->right) {
                travStack.push(p);
            }
            while (p != 0 && (p->right == 0) || p->right == q) {
                visit(p);
                q = p;
                if (travStack.empty()) {
                    return;
                }
                p = travStack.pop();
            }
            travStack.push(p);
            p = p->right;
        }
    }
};

一般来讲,递归效率不是很好,尽量采用非递归形式~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值