C++二叉树的链表实现

来源:互联网 发布:uv淘宝论坛 编辑:程序博客网 时间:2024/06/12 01:26

包括创建二叉树、递归遍历二叉树、非递归遍历二叉树等操作,请大家注意创建二叉树的函数,注意创建好的输入是怎样的,如下图所示的输入应该为ABC##DE#G##F###,类似于先序遍历。
这里写图片描述

#include <iostream>#include <stack>using namespace std;typedef struct Node{    char data;    struct Node* lchild;    struct Node* rchild;}Tree;Tree* createBinTree(){    /*char ch = getchar();    Tree* root;    if (ch  == '#'){        return NULL;    }    else{        root = (Tree*)malloc(sizeof(Tree));        if (root == NULL) return NULL;        root->data = ch;        root->lchild = createBinTree();        root->rchild = createBinTree();        return root;    }*/    char ch;    Tree* root;    if ((ch = getchar()) != '#'){        root = (Tree*)malloc(sizeof(Tree));        if (root == NULL){            return NULL;        }        root->data = ch;        root->lchild=createBinTree();        root->rchild = createBinTree();    }    else{        return NULL;    }    return root;}void createBinTree(Tree* &t){    /*char ch;    cin>>ch;    if (ch == '#'){    t = NULL;    }    else{    t = (Tree*)malloc(sizeof(Tree));    t->data = ch;    createBinTree(t->lchild);    createBinTree(t->rchild);    }*/    char ch;    if ((ch = getchar()) != '#'){        t = (Tree*)malloc(sizeof(Tree));        t->data = ch;        createBinTree(t->lchild);        createBinTree(t->rchild);    }    else{        t = NULL;    }}void preOrderTraverse(Tree* &t){    if (t != NULL){        cout << t->data;        preOrderTraverse(t->lchild);        preOrderTraverse(t->rchild);    }}void preOrderTraverseNonRecur(Tree* t){    stack<Tree*> stack;    Tree* p = t;    while (p != NULL || !stack.empty()){        while (p != NULL){            cout << p->data << " ";            stack.push(p);            p = p->lchild;        }        if (!stack.empty()){            p = stack.top();            stack.pop();            p = p->rchild;        }    }}void inOrderTraverse(Tree* &t){    if (t != NULL){        inOrderTraverse(t->lchild);        cout << t->data;        inOrderTraverse(t->rchild);    }    else{        cout << " ";    }}void inOrderTraverseNonRecur(Tree* t){    stack<Tree*> stack;    Tree* p = t;    while (p != NULL || (!stack.empty())){        while (p != NULL){            stack.push(p);            p = p->lchild;        }        if (!stack.empty()){            p = stack.top();            cout << p->data << " ";            stack.pop();            p = p->rchild;        }    }}void postOrderTraverse(Tree* &t){    if (t != NULL){        postOrderTraverse(t->lchild);        postOrderTraverse(t->rchild);        cout << t->data;    }    else{        cout << " ";    }}void postOrderTraverseNonRecur(Tree* t){    Tree* cur = t;    Tree* pre = NULL;    stack<Tree*> stack;    stack.push(cur);    while (!stack.empty()){        cur = stack.top();        if ((cur->lchild == NULL&&cur->rchild == NULL) || (pre != NULL && (cur->lchild==pre||cur->rchild == pre))){            cout << cur->data << " ";            stack.pop();            pre = cur;        }        else{            if (cur->rchild != NULL){                stack.push(cur->rchild);            }            if (cur->lchild != NULL){                stack.push(cur->lchild);            }        }    }}int main(){    Tree* t = NULL;    createBinTree(t);    cout << "前序遍历:";    preOrderTraverseNonRecur(t);    cout << "\n中序遍历:";    inOrderTraverseNonRecur(t);    cout << "\n后序遍历:";    postOrderTraverseNonRecur(t);}
原创粉丝点击