C++ 二叉树的遍历

#include <bits/stdc++.h>
#define MaxSize 100
/*
 * Created by HarvestWu on 2018/06/19.
 */
using namespace std;
typedef char ElemType;

//定义二叉树结构
typedef struct BTNode
{
    ElemType data;
    struct BTNode *lchild;
    struct BTNode *rchild;
} BTNode;

//定义存储结点指针及层号结构
typedef struct St
{
    BTNode *p;
    int lno;

} St;
//由str串创建二树
void CreateBTNode (BTNode *&b,ElemType *str)
{
    BTNode *St[MaxSize],*p= NULL;
    int top=-1, k = 0,j=0;
    ElemType ch;
    b= NULL;
    ch=str[j];
    while (ch!='\0')
    {
        switch (ch)
        {
        case '(':
            top++;
            St[top]=p;
            k=1;
            break;
        case ')':
            top--;
            break;
        case ',':
            k=2;
            break;
        default:
            p=(BTNode *)malloc(sizeof(BTNode));
            p->data=ch;
            p->lchild=p->rchild= NULL;
            if (b== NULL)
                b=p;
            else
            {
                switch(k)
                {
                case 1:
                    St[top]->lchild=p;
                    break;
                case 2:
                    St[top]->rchild=p;
                    break;
                default:
                    break;
                }
            }
        }
        j++;
        ch=str[j];
    }
}

//递归先序遍历
void preOrder(BTNode *p)
{
    if (p!= NULL)
    {
        cout<<p->data<<" ";
        preOrder(p->lchild);
        preOrder(p->rchild);
    }
}

//非递归先序遍历
void preOrderNonRecursion(BTNode *p)
{
    if (p!= NULL)
    {
        BTNode *Stack[MaxSize];
        int top=-1;
        BTNode *q;
        Stack[++top]=p;
        while(top!=-1)
        {
            q=Stack[top--];
            cout<<q->data<<" ";
            if(q->rchild!=NULL)
                Stack[++top]=q->rchild;
            if(q->lchild!=NULL)
                Stack[++top]=q->lchild;
        }
    }
}

//递归中序遍历
void inOrder(BTNode *p)
{
    if (p!= NULL)
    {
        inOrder(p->lchild);
        cout<<p->data<<" ";
        inOrder(p->rchild);
    }
}

//非递归中序遍历
void inOrderNonRecursion(BTNode *p)
{
    if(p!=NULL)
    {
        BTNode *Stack[MaxSize];
        int top=-1;
        BTNode *q;
        q=p;
        while(top!=-1||q!=NULL)
        {
            while(q!=NULL)
            {
                Stack[++top]=q;
                q=q->lchild;
            }
            if(top!=-1)
            {
                q=Stack[top--];
                cout<<q->data<<" ";
                q=q->rchild;
            }
        }
    }
}


//递归后序遍历
void postOrder(BTNode *p)
{
    if (p!= NULL)
    {
        postOrder(p->lchild);
        postOrder(p->rchild);
        cout<<p->data<<" ";
    }
}

//非递归后序遍历
void postOrderNonRecursion(BTNode *p)
{
    if (p!= NULL)
    {
        BTNode *Stack1[MaxSize],*Stack2[MaxSize];
        int top1=-1,top2=-1;
        BTNode *q;
        Stack1[++top1]=p;
        while(top1!=-1)
        {
            q=Stack1[top1--];
            Stack2[++top2]=q;
            if(q->lchild!=NULL)
                Stack1[++top1]=q->lchild;
            if(q->rchild!=NULL)
                Stack1[++top1]=q->rchild;
        }
        while(top2!=-1)
        {
            q=Stack2[top2--];
            cout<<q->data<<" ";
        }
    }
}

//求二叉树深度
int getDepth(BTNode *p)
{
    int LD,RD;
    if(p==NULL)
        return 0;
    else
    {
        LD=getDepth(p->lchild);
        RD=getDepth(p->rchild);
        return (LD>RD?LD:RD)+1;
    }
}

//寻找二叉树中是否存在某值节点
void searchBTNode(BTNode *p,BTNode *&q,int key)
{
    if(p!=NULL)
    {
        if(p->data==key)
            q=p;
        else
        {
            searchBTNode(p->lchild,q,key);
            searchBTNode(p->rchild,q,key);
        }
    }
}

//层序遍历
void level(BTNode *p)
{
    int front,rear;
    BTNode *que[MaxSize];
    front=rear=0;
    BTNode *q;
    if (p!=NULL)
    {
        rear=(rear+1)%MaxSize;
        que[rear]=p;
        while (front!=rear)
        {
            front=(front+1)%MaxSize;
            q=que[front];
            cout<<q->data<<" ";
            if (q->lchild!=NULL)
            {
                rear=(rear+1)%MaxSize;
                que[rear]=q->lchild;
            }
            if(q->rchild!=NULL)
            {
                rear=(rear+1)%MaxSize;
                que[rear]=q->rchild;
            }
        }
    }

}

//求二叉树宽度
int maxNode(BTNode *b)
{
    St que[MaxSize];
    int front,rear;
    int Lno,i,j,n,max;
    front=rear=0;
    BTNode *q;
    if (b!=NULL)
    {
        ++rear;
        que[rear].p=b;
        que[rear].lno=1;
        while (front!=rear)
        {
            ++front;
            q=que[front].p;
            Lno=que[front].lno;
            if(q->lchild!=NULL)
            {
                ++rear;
                que[rear].p=q->lchild;
                que[rear].lno=Lno+1;
            }

            if(q->rchild!=NULL)
            {
                ++rear;
                que[rear].p=q->rchild;
                que[rear].lno=Lno+1;
            }
        }
        max=0;
        for(i=1; i<=Lno; ++i)
        {
            n=0;
            for(j=1; j<rear; ++j)
            {
                if(que[j].lno==i)
                    ++n;
            }
            if(max<n)
                max=n;
        }
        return max;
    }
    else return 0;
}

int main()
{
    BTNode *b,*p,*lp,*rp;;
    CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");

    cout<<"递归先序遍历:"<<endl;
    preOrder(b);

    cout<<"\n非递归先序遍历:"<<endl;
    preOrderNonRecursion(b);

    cout<<"\n递归中序遍历:"<<endl;
    inOrder(b);

    cout<<"\n非递归中序遍历:"<<endl;
    inOrderNonRecursion(b);

    cout<<"\n递归后序遍历:"<<endl;
    postOrder(b);

    cout<<"\n非递归后序遍历:"<<endl;
    postOrderNonRecursion(b);

    cout<<"\n二叉树深度:"<<endl;
    cout<<getDepth(b);

    cout<<"\n寻找二叉树中是否存在某值节点:"<<endl;
    searchBTNode(b,p,'A');
    cout<<p->data;

    cout<<"\n层序遍历:"<<endl;
    level(b);

    cout<<"\n二叉树宽度:"<<endl;
    cout<<maxNode(b)<<endl;


    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中的二叉树遍历算法主要包括三种方式:前序遍历、中序遍历和后序遍历。此外,还有层次遍历,但通常我们讨论的是前三种。 1. 前序遍历(Pre-order Traversal):首先访问根节点,然后递归地先序遍历左子树,接着递归地先序遍历右子树。遍历顺序为根节点 -> 左子树 -> 右子树。 2. 中序遍历(In-order Traversal):首先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。对于二叉搜索树,中序遍历可以得到一个有序的元素序列。遍历顺序为左子树 -> 根节点 -> 右子树。 3. 后序遍历(Post-order Traversal):首先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点。遍历顺序为左子树 -> 右子树 -> 根节点。 以下是三种遍历算法的简单示例代码: ```cpp struct TreeNode { int val; TreeNode *left; TreeNode *right; TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} }; void preOrder(TreeNode* root) { if (root == nullptr) return; // 访问根节点 visit(root); // 遍历左子树 preOrder(root->left); // 遍历右子树 preOrder(root->right); } void inOrder(TreeNode* root) { if (root == nullptr) return; // 遍历左子树 inOrder(root->left); // 访问根节点 visit(root); // 遍历右子树 inOrder(root->right); } void postOrder(TreeNode* root) { if (root == nullptr) return; // 遍历左子树 postOrder(root->left); // 遍历右子树 postOrder(root->right); // 访问根节点 visit(root); } ``` 在实际应用中,可能还需要根据具体情况进行变体处理,比如非递归实现,使用栈等数据结构来模拟递归过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值