输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。

题目描述

输入一系列整数,建立二叉排序树,并进行前序,中序,后序遍历。

输入描述:

输入第一行包括一个整数n(1<=n<=100)。
接下来的一行包括n个整数。

输出描述:

可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。
每种遍历结果输出一行。每行最后一个数据之后有一个空格。

输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。

示例1

输入

复制

5
1 6 5 9 8

输出

复制

1 6 5 9 8 
1 5 6 8 9 
5 8 9 6 1 

题目表述可能不明确,这边“输入中可能有重复元素,但是输出的二叉树遍历序列中重复元素不用输出。” 的意思是,在建立搜索树的时候,就将重复的排除掉,重复的就不用插入到树里面了。

 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

struct Btree
{
    int x;
    Btree *left;
    Btree *right;
    Btree()
    {
        left=NULL;
        right=NULL;
    }
};
typedef struct Btree Btree;
Btree *root;
int n;
int vis[10000];

void Insert(int x,Btree *&r)
{
    if(r==NULL)
    {
        r=new Btree;
        r->x=x;
    }
    else
    {
        if(x<r->x)
        {
            Insert(x,r->left);
        }
        else
        {
            Insert(x,r->right);
        }
    }
}

void xian(Btree* r)
{
    if(r==NULL)
    {
        return ;
    }
    printf("%d ",r->x);
    xian(r->left);
    xian(r->right);
}

void zhong(Btree* r)
{
    if(r==NULL)
    {
        return ;
    }
    zhong(r->left);
    printf("%d ",r->x);
    zhong(r->right);
}

void hou(Btree* r)
{
    if(r==NULL)
    {
        return ;
    }
    hou(r->left);
    hou(r->right);
    printf("%d ",r->x);

}

int Find(int x,Btree *r)
{
    if(r==NULL)
    {
        return 0;
    }
    else
    {
        if(r->x==x)
        {
            return 1;
        }
        else
        {
            int left= Find(x,r->left);
            int right=Find(x,r->right);
            return left+right;
        }
    }
}


int main()
{
    while(scanf("%d",&n)==1)
    {
        root=NULL;
        for(int i=0;i<n;i++)
        {
            int x;
            scanf("%d",&x);
            if(Find(x,root)==0)
            {
                Insert(x,root);
            }
        }
        xian(root);
        printf("\n");
        zhong(root);
        printf("\n");
        hou(root);
        printf("\n");

    }
    return 0;
}

 

  • 7
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 二叉链表存储结构是一种常见的树结构存储方式,其中每个节点最多有两个子节点,称为左子节点和右子节点。为了方便讨论,我们假设每个节点的数据类型为整数二叉树的存储结构通常由节点和指针组成。每个节点包含三个元素:数据元素本身、指向左子树的指针和指向右子树的指针。具体地说,每个节点的定义如下: ``` struct TreeNode { int data; TreeNode* left; TreeNode* right; }; ``` 其中,data 表示节点的数据元素,left 和 right 分别表示指向左子树和右子树的指针。如果节点没有左子树或右子树,则对应的指针为 null。 二叉树前序中序后序遍历是指按照一定的顺序遍历二叉树的节点,具体的定义如下: - 前序遍历:先访问根节点,再访问左子树,最后访问右子树。 - 中序遍历:先访问左子树,再访问根节点,最后访问右子树。 - 后序遍历:先访问左子树,再访问右子树,最后访问根节点。 二叉树的遍历可以通过递归算法来实现。以前序遍历为例,其算法可以描述如下: ``` void preOrderTraversal(TreeNode* root) { if (root != null) { cout << root->data << " "; // 先访问根节点 preOrderTraversal(root->left); // 再访问左子树 preOrderTraversal(root->right); // 最后访问右子树 } } ``` 其中,root 表示当前节点的指针,如果为 null 则表示当前节点为空。算法的基本思路是:如果当前节点不为空,则先输出当前节点的值,然后递归地访问左子树和右子树。 中序遍历和后序遍历的算法类似,只需要将输出当前节点的值的位置移动即可。 ### 回答2: 二叉链表存储结构是指在二叉树中每个结点存储其左右孩子结点的指针以及其父节点的指针。这种存储结构方便了二叉树的各种操作,其中最为基本的操作就是遍历二叉树二叉树遍历指的是按照一定顺序,依次访问二叉树中每个结点,以达到查找、打印或进行其他操作的目的。常见的遍历方式有前序(根左右)、中序(左根右)和后序(左右根)三种。 以前序遍历为例,其算法的伪代码如下: ``` void preOrderTraversal(Node* root) { if (root != NULL) { // 如果根节点不为空 visit(root); // 访问根节点 preOrderTraversal(root->left); // 遍历左子树 preOrderTraversal(root->right); // 遍历右子树 } } ``` 对于中序遍历和后序遍历,其算法逻辑非常类似,只需要在递归调用的位置上稍作修改即可。中序遍历的算法伪代码如下: ``` void inOrderTraversal(Node* root) { if (root != NULL) { // 如果根节点不为空 inOrderTraversal(root->left); // 遍历左子树 visit(root); // 访问根节点 inOrderTraversal(root->right); // 遍历右子树 } } ``` 后序遍历的算法伪代码如下: ``` void postOrderTraversal(Node* root) { if (root != NULL) { // 如果根节点不为空 postOrderTraversal(root->left); // 遍历左子树 postOrderTraversal(root->right); // 遍历右子树 visit(root); // 访问根节点 } } ``` 以上三个遍历算法都是采用递归的方式实现的。在每个结点的访问过程中,需要进行一定的操作,例如输出结点值、将结点值累加等。这些操作由 visit 函数实现。 总之,二叉链表存储结构实现了二叉树结构的清晰化、易读性以及便于遍历等优点,在算法实现中,其前序中序后序遍历的递归算法是比较基础且重要的,需要学习掌握。 ### 回答3: 二叉链表存储结构是指在存储二叉树的每个节点时,除了保存节点的值外,还保存该节点的左孩子和右孩子的指针地址。这样,我们可以通过指针的指向来遍历整个二叉树。 在二叉链表存储结构中,可以采用递归方式来实现前序中序后序遍历。具体算法如下: 1. 前序遍历 前序遍历的算法是先遍历根节点,然后依次遍历左子树和右子树。具体实现方式为: - 若当前节点非空,则输出当前节点的值; - 若当前节点有左孩子,则递归遍历左子树; - 若当前节点有右孩子,则递归遍历右子树。 2. 中序遍历 中序遍历的算法是先遍历左子树,然后遍历根节点,最后再遍历右子树。具体实现方式为: - 若当前节点有左孩子,则递归遍历左子树; - 若当前节点非空,则输出当前节点的值; - 若当前节点有右孩子,则递归遍历右子树。 3. 后序遍历 后序遍历的算法是先遍历左子树,然后遍历右子树,最后遍历根节点。具体实现方式为: - 若当前节点有左孩子,则递归遍历左子树; - 若当前节点有右孩子,则递归遍历右子树; - 若当前节点非空,则输出当前节点的值。 需要注意的是,在以上算法中,需要判断当前节点是否为空,否则会引起空指针异常。另外,递归时需要将当前节点作为参数传递,以便能够访问该节点的左孩子和右孩子。 综上所述,二叉链表存储结构的前序中序后序遍历算法比较简单,只需通过递归方式来遍历整个二叉树,但也需要注意空指针异常的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值