二叉树叶子节点迭代器

来源:互联网 发布:中文域名注册查询 编辑:程序博客网 时间:2024/06/08 13:54


开始的想法是先将叶子节点放入到一个vector中,然后依次next

下面的解法类似,但是只有在Next操作时才寻找下一个叶子节点


template <typename T>class Iterator{        public:        Iterator(T *root)        {                if(root == NULL) return;                st.push(root);                probe();        }        bool hasNext() { return (st.size() > 0); }        T *next()        {                T *node = st.top();                st.pop();                if(!st.empty())                        probe();                return node;        }        private:        stack<T *> st;        bool leaf(T *node)        {                return (node->leftChild() == NULL && node->rightChild() == NULL);        }        void probe()        {                T *now = st.top();                while(!leaf(now)) {                        st.pop();                        if(now->rightChild())                                st.push(now->rightChild());                        if(now->leftChild())                                st.push(now->leftChild());                        now = st.top();                }        }};


不用空间的方法是,记录上一次迭代到的叶子节点curr, 下一个叶子节点必须是经过curr的下一个叶子节点


struct NODE {        int nVal;        NODE* pLft;        NODE* pRgt;        NODE(int n) : nVal(n), pLft(NULL), pRgt(NULL)        {}};void _inner_get_next(NODE* pNode, NODE* pIter, bool& bFlag, NODE*& pNext){        if (NULL == pNode) return;        _inner_get_next(pNode->pLft, pIter, bFlag, pNext);        if (NULL != pNext) return;        if (bFlag && NULL == pNode->pLft && NULL == pNode->pRgt)        {                pNext = pNode;                return;        }        if (pIter == pNode) bFlag = true;        _inner_get_next(pNode->pRgt, pIter, bFlag, pNext);}NODE* GetNext(NODE* pRoot, NODE* pIter){        if (NULL == pRoot || NULL == pIter)                return NULL;        NODE* pNext = NULL;        bool bFlag = false;        _inner_get_next(pRoot, pIter, bFlag, pNext);        return pNext;}


原创粉丝点击