树的遍历,前中后+层次遍历非递归

来源:互联网 发布:域名出售平台哪个好 编辑:程序博客网 时间:2024/06/06 00:22

存在内存泄漏,,,,原因是没有销毁结点时内存释放的处理.

#include<iostream>#include<deque>#include<stack>#include<string>using namespace std;class cbtnode{public:    char data;    cbtnode * parent;    cbtnode * lchild;    cbtnode * rchild;};typedef cbtnode btnode;class cbtroot{public:    cbtroot(string &s)    {        settree(s);    }    void xianxubianli1()//递归形式的先序遍历    {        xianxubianli1(root);    }private:    void xianxubianli1(btnode *node)    {        if (node == nullptr)            return;        cout << node->data << "  ";        xianxubianli1(node->lchild);        xianxubianli1(node->rchild);    }public:/*非递归形式的遍历,都是通过栈来完成的.比如先序遍历当节点出栈的时候要先将该节点的右孩子入栈然后在入左孩子...*中序遍历的话先不断的将左孩子入栈,当左孩子出栈的时候如果父亲有右孩子,那么就将右孩子的左孩子不断入栈.没有的话就不断出栈知道右孩子不为空..*后序遍历则是在中序的基础上需要了一个标志位,如果该节点的右孩子没有遍历才遍历,遍历过了就直接出栈.*/    void xianxubianli2()    {        if (root == nullptr)            return;        stack<btnode*> node_stack;        node_stack.push(root);        while (!node_stack.empty())        {            btnode * outp = node_stack.top();            node_stack.pop();            cout << outp->data;            if (outp->rchild != nullptr)                node_stack.push(outp->rchild);            if (outp->lchild != nullptr)                node_stack.push(outp->lchild);        }    }    void zhongxubianli1()    {        stack<btnode*> node_stack;        node_stack.push(root);        btnode * outp;        while (!node_stack.empty())        {            outp = node_stack.top();            while (outp->lchild != nullptr)            {                node_stack.push(outp->lchild);                outp = outp->lchild;            }            while (!node_stack.empty())            {                outp = node_stack.top();                cout << outp->data << " ";                node_stack.pop();                if (outp->rchild != nullptr)                {                    node_stack.push(outp->rchild);                    break;                }            }        }    }    void houxubianli1()    {        stack<btnode*> node_stack;        node_stack.push(root);        btnode * outp;        btnode * tag = nullptr;//标志位        while (!node_stack.empty())        {            outp = node_stack.top();            while (outp->lchild != nullptr)            {                node_stack.push(outp->lchild);                outp = outp->lchild;            }            while (!node_stack.empty())            {                outp = node_stack.top();                if (outp->rchild != nullptr && tag != outp->rchild)                {                    node_stack.push(outp->rchild);                    break;                }                else                {                    cout << outp->data << " ";                    //当右孩子被遍历过了才进行打印和出栈                    node_stack.pop();                    tag = outp;                }            }        }    }    //层次遍历则是一个队列来完成的,很简单不说了.    void cengcibianli()    {        deque<btnode *> node_que;        node_que.push_back(root);        btnode * outp;        while (!node_que.empty())        {            outp = node_que.front();            node_que.pop_front();            if (outp->lchild != nullptr)                node_que.push_back(outp->lchild);            if (outp->rchild != nullptr)                node_que.push_back(outp->rchild);            cout << outp->data << " ";        }    }private:    btnode * search(char);    void settree(string &s);    cbtnode * root;};typedef cbtroot btroot;btnode * buynode(char data, btnode*l, btnode *r, btnode * p){    btnode *root = (btnode*)malloc(sizeof(btnode));    root->data = data;    root->lchild = l;    root->rchild = r;    root->parent = p;    return root;}btnode * btroot::search(char key){    btnode * tmp = root;    btnode * par = nullptr;    while (tmp != nullptr && tmp->data != key)    {        par = tmp;        if (tmp->data < key)        {            tmp = tmp->rchild;        }        else        {            tmp = tmp->lchild;        }    }    if (tmp != nullptr)    {        return nullptr;    }    return par;}void btroot::settree(string &s) {    for (int i = 0; i < s.size(); ++i)    {        if (root == nullptr)        {            root = buynode(s[i], nullptr, nullptr, nullptr);        }        else        {            btnode * tmp = search(s[i]);            if (tmp == nullptr)                continue;            btnode * insert_node = buynode(s[i], nullptr, nullptr, tmp);            if (s[i] < tmp->data)                tmp->lchild = insert_node;            else                tmp->rchild = insert_node;        }    }}int main(){    string str = { "ebhadgcifk" };    //这是一棵二叉搜索树....    btroot *root = new btroot(str);    root->cengcibianli();//层次遍历    return 0;}
0 0
原创粉丝点击