括号表达式的建树 以及前序中序后续遍二叉树历树(非递归)

#include<iostream>
using namespace std;
    typedef class node
        {
            public :
                int data;
                node *left;
                node *right;
        }*BTNode,btnode;

        typedef class qnodet
            {
                public:
                   BTNode t;
                   qnodet *next;
            }*Qnode,qnode;

     void init_LinkStack(Qnode &L);//初始化栈
     bool Stack_empty(Qnode &L);//判断栈是否为空
     void  LinkStack_insert(Qnode &L,BTNode p);//插入
     BTNode LinkStack_pop(Qnode &L);//栈弹出
     void CreatBTNode(BTNode &L,char *str);//树的创建
     void printlist(BTNode );
     void mid_printlist(BTNode L);//中序遍历
     void pre_printlist(BTNode L);//前序遍历
     void last_printlist(BTNode L);//后续遍历(先求逆后续)
     void follow_up_printlist(BTNode L);//后续遍历

        int main()
            {
                char str[50]="A(B(D(,G)),C(E,F))";
                BTNode p=NULL;
                CreatBTNode(p,str);
                follow_up_printlist(p);
                cout<<endl;
                cout<<"前序遍历";
                pre_printlist(p);
                cout<<"中序遍历";
                mid_printlist(p);
                cout<<"后续遍历";
                last_printlist(p);


                return 0;
            }

    void init_LinkStack(Qnode &L)
        {
            L=new qnode;
            L->next=NULL;


        }

    bool Stack_empty(Qnode &L)
        {
            if(L->next==NULL)

                {
                    return true;
                }

                else

                {
                    return false;
                }
        }

    void  LinkStack_insert(Qnode &L,BTNode p)
        {
            Qnode s=new qnode;
            s->t=p;
            s->next=L->next;
            L->next=s;

        }

     BTNode LinkStack_pop(Qnode &L)
        {
            Qnode p=L->next;
            if(!Stack_empty(L))
                {
                    L->next=p->next;
                    p->next=NULL;
                    return p->t;
                }
            else
                {
                    return NULL;
                }
        }

    void CreatBTNode(BTNode &L,char *str)
        {
            Qnode temp_stack;
            init_LinkStack(temp_stack);
            BTNode p;
            int k,i=0;
            while(str[i]!='\0')
            {
                switch(str[i])
                    {
                        case '(':
                               LinkStack_insert(temp_stack,p);
                               k=1;
                               break;
                        case ')':
                            LinkStack_pop(temp_stack);
                            break;
                        case ',':
                            k=2;
                            break;
                        default:
                            p=new btnode;
                            p->data=str[i];
                            p->left=NULL;
                            p->right=NULL;
                            if(L==NULL)
                            {
                                L=p;
                            }
                            else
                            {
                                switch(k)
                                    {
                                        case 1:
                                            temp_stack->next->t->left=p;
                                            break;
                                        case 2:
                                            temp_stack->next->t->right=p;
                                            break;
                                    }
                            }
                        }

                    i++;
                }

        }

        void printlist(BTNode L)
            {
              if(L!=NULL)
              {
                  cout<<char(L->data)<<endl;
                  printlist(L->left);
                  printlist(L->right);
              }
            }

        void mid_printlist(BTNode L)//中序遍历
            {
                BTNode p=L;
                Qnode Stack;
                init_LinkStack(Stack);
                while(p!=NULL||!Stack_empty(Stack))
                {
                    while(p!=NULL)
                    {
                        LinkStack_insert(Stack,p);
                        p=p->left;
                    }
                    if(!Stack_empty(Stack))
                    {
                        p=LinkStack_pop(Stack);
                        cout<<char(p->data)<<" ";
                        p=p->right;
                    }

                }

                cout<<endl;
            }

        void pre_printlist(BTNode L)//前序遍历
            {

                BTNode p=L;
                Qnode Stack;
                init_LinkStack(Stack);
                while(p!=NULL||!Stack_empty(Stack))
                {
                    while(p!=NULL)
                    {
                        LinkStack_insert(Stack,p);
                        cout<<char(p->data)<<" ";
                        p=p->left;
                    }
                    if(!Stack_empty(Stack))
                    {
                        p=LinkStack_pop(Stack);
                        p=p->right;
                    }
                }

                cout<<endl;
            }

        void last_printlist(BTNode L)//后续遍历(先求逆后续)
            {
                BTNode p=L;
                Qnode Stack;
                Qnode temp_Stack;
                init_LinkStack(Stack);
                init_LinkStack(temp_Stack);
                while(p!=NULL||!Stack_empty(Stack))
                {
                    while(p!=NULL)
                    {
                        LinkStack_insert(Stack,p);
                        LinkStack_insert(temp_Stack,p);
                        p=p->right;
                    }

                    if(!Stack_empty(Stack))
                    {
                        p=LinkStack_pop(Stack);
                        p=p->left;
                    }
                }
                Qnode q=temp_Stack->next;
                while(q!=NULL)
                {
                    cout<<char(q->t->data)<<" ";
                    q=q->next;
                }
                cout<<endl;
            }


        void follow_up_printlist(BTNode L)//后续遍历
            {
                BTNode p=L;
                Qnode Stack;
                init_LinkStack(Stack);
                /*LinkStack_insert(Stack,p);
                p=p->left*/   //如果向先入栈,一定要让p=p->left  否则实际入栈会有多余的
                BTNode flag=NULL;
                while(!Stack_empty(Stack)||p!=NULL)
                {
                    while(p!=NULL)
                    {
                        LinkStack_insert(Stack,p);
                        p=p->left;
                    }

                    if(!Stack_empty(Stack))
                    {
                        p=LinkStack_pop(Stack);
                        if(p->right==NULL||p->right==flag)
                        {
                            cout<<char(p->data)<<" ";
                            flag=p;
                            p=NULL;

                        }
                        else
                        {

                            LinkStack_insert(Stack,p);
                            p=p->right;
                        }
                    }
                }
            }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是C++数据结构二叉树前序中序后序遍历的递归和非递归实现代码。 ```c++ // 定义二叉树的结构体 struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 二叉树前序历(递归)代码 void preorderTraversal(TreeNode* root) { if (root == NULL) return; cout << root->val << " "; // 输出当前节点的值 preorderTraversal(root->left); // 递归历左子 preorderTraversal(root->right); // 递归历右子 } // 二叉树前序历(非递归)代码 void preorderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> s; // 定义栈 s.push(root); // 根节点入栈 while (!s.empty()) { TreeNode* cur = s.top(); // 取出栈顶元素 s.pop(); cout << cur->val << " "; // 输出当前节点的值 if (cur->right != NULL) s.push(cur->right); // 先将右子入栈 if (cur->left != NULL) s.push(cur->left); // 再将左子入栈 } } // 二叉树中序历(递归)代码 void inorderTraversal(TreeNode* root) { if (root == NULL) return; inorderTraversal(root->left); // 递归历左子 cout << root->val << " "; // 输出当前节点的值 inorderTraversal(root->right); // 递归历右子 } // 二叉树中序历(非递归)代码 void inorderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> s; // 定义栈 TreeNode* cur = root; while (cur != NULL || !s.empty()) { while (cur != NULL) { // 将当前节点及其左子入栈 s.push(cur); cur = cur->left; } cur = s.top(); // 取出栈顶元素 s.pop(); cout << cur->val << " "; // 输出当前节点的值 cur = cur->right; // 历右子 } } // 二叉树后序遍历(递归)代码 void postorderTraversal(TreeNode* root) { if (root == NULL) return; postorderTraversal(root->left); // 递归历左子 postorderTraversal(root->right); // 递归历右子 cout << root->val << " "; // 输出当前节点的值 } // 二叉树后序遍历非递归)代码 void postorderTraversal(TreeNode* root) { if (root == NULL) return; stack<TreeNode*> s1, s2; // 定义两个栈 s1.push(root); // 根节点入栈 while (!s1.empty()) { TreeNode* cur = s1.top(); // 取出栈顶元素 s1.pop(); s2.push(cur); // 将栈顶元素存入第二个栈 if (cur->left != NULL) s1.push(cur->left); // 将左子入栈 if (cur->right != NULL) s1.push(cur->right); // 将右子入栈 } while (!s2.empty()) { cout << s2.top()->val << " "; // 输出第二个栈的元素 s2.pop(); } } ``` 希望这些代码可以帮助到您。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值