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

该博客介绍如何根据一系列整数构建二叉排序树,并详细阐述了如何进行前序、中序和后序遍历。虽然输入可能存在重复元素,但遍历结果不包含重复值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 题目描述:

    输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入:
    输入第一行包括一个整数n(1<=n<=100)。
    接下来的一行包括n个整数。
输出:
    可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序、中序和后序遍历。
    每种遍历结果输出一行。每行最后一个数据之后有一个空格。
样例输入:
5
1 6 5 9 8
样例输出:
1 6 5 9 8 
1 5 6 8 9 
5 8 9 6 1 
提示:

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

#include <iostream>  
using namespace std;  
#include <stdio.h>  
#include <stdlib.h>  
  
typedef struct BiTNode  
{  
    int value;  
    struct BiTNode *lchild,*rchild;  
}*BiTree;  
  
bool LT(int a,int b)  //LessThan小于  
{  
    if(a<b)  
        return true;  
    else  
        return false;  
}  
/* 
在根指针root所指向的二叉排序树中递归地查找其关键字等于data的数据元素,若查找成功,则指针p指向该数据元素结点,并返回true, 
否则指针p指向查找路径上访问的最后一个结点并返回false指针,指针f指向root的双亲,其初始调用值NULL 
*/  
bool SearchBST(BiTree root,int data,BiTree f,BiTree &p)  
{  
    if(!root)  
    {  
        p=f;  
        return false;  
    }  
    else if(data==root->value)  
    {  
        p=root;  
        return true;  
    }  
    else if(data<root->value)  
        return SearchBST(root->lchild,data,root,p);  
    else if(data>root->value)  
        return SearchBST(root->rchild,data,root,p);  
}  
  
//当二叉排序树root中不存在关键字等于data的数据元素时,插入data,此函数调用频率高,所以设置成inline
inline void InsertBST(BiTree &root,int data)     //root为传引用指针  
{    
    BiTree p,s;  
    if(!SearchBST(root,data,NULL,p))    //查找不成功  
    {  
        s=(struct BiTNode *)malloc(sizeof(BiTNode));  
        s->value=data;  
        s->lchild=s->rchild=NULL;  
        if(p==NULL)    //二叉排序树为空的时候,被插入结点*s为新的根结点  
            root=s;  
        else if(LT(data,p->value))           //被插结点*s为左孩子  
            p->lchild=s;  
        else           //被插结点*s为右孩子  
            p->rchild=s;  
    }  
    return ;  
}  
void PreOrderTraverse(BiTree root)    //先序遍历  
{  
    if(root)  
    {  
        printf("%d ",root->value);  
        PreOrderTraverse(root->lchild);  
        PreOrderTraverse(root->rchild);  
    }  
}  
void InOrderTraverse(BiTree root)    //中序遍历  
{  
    if(root)  
    {  
        InOrderTraverse(root->lchild);  
        printf("%d ",root->value);  
        InOrderTraverse(root->rchild);  
    }  
}  
void PostOrderTraverse(BiTree root)    //后序遍历  
{  
    if(root)  
    {  
        PostOrderTraverse(root->lchild);  
        PostOrderTraverse(root->rchild);  
        printf("%d ",root->value);  
    }  
}  
void DeleteBST(BiTree root)  //释放二叉树占用的内存空间
{  
    if(root)  
    {  
        DeleteBST(root->lchild);    //释放左子树  
        DeleteBST(root->rchild);    //释放右子树  
        free(root);        //释放根结点  
    }  
}  
int main(void)  
{  
    int i,a[101],n;  
    BiTree root;  
    while(scanf("%d",&n)!=EOF)  
    {  
        root=NULL;  
        for(i=1;i<=n;i++)  
        {  
            scanf("%d",&a[i]);  
            InsertBST(root,a[i]);  
        }  
        PreOrderTraverse(root);  
        printf("\n");  
        InOrderTraverse(root);  
        printf("\n");  
        PostOrderTraverse(root);  
        printf("\n");  
        DeleteBST(root);  
    }  
    return 0;  
}


构建一个接收整数并构建二叉排序树的程通常包含以下几个步骤: 1. **定义数据结构**:首先,你需要定义一个二叉树节点的数据结构,它包含整数值、左孩子和右孩子的引用。 ```python class TreeNode: def __init__(self, value): self.value = value self.left = None self.right = None ``` 2. **插入操作**:当接收到一个整数时,你可以创建一个新的节点并将值放入适当的位置以保持。从根节点开始比较,如果新值小于当前节点,就往左子树添加;反之则往右子树添加。 ```python def insert(root, value): if root is None: return TreeNode(value) else: if value < root.value: root.left = insert(root.left, value) else: root.right = insert(root.right, value) return root ``` 3. **遍历展示**:为了查看整个二叉排序树,可以使用递归遍历方法如前、中后序遍历。 4. **删除节点**:删除节点时需要考虑多种情况: - 如果要删除的节点没有子节点,直接将其父节点的引用设置为空即可。 - 如果只有一个子节点,将该子节点替换到父节点位置。 - 如果有两个子节点,则找到其右子树中的最小节点(左子树的最大节点),用这个最小节点替换被删除节点,并递归地在右子树中删除那个最小节点。 ```python def delete_node(root, value): if root is None: return root if value < root.value: root.left = delete_node(root.left, value) elif value > root.value: root.right = delete_node(root.right, value) else: # 删除节点的情况分析 if root.left is None and root.right is None: root = None elif root.left is None: temp = root.right root = None return temp elif root.right is None: temp = root.left root = None return temp else: min_value = find_min_value(root.right) root.value = min_value root.right = delete_node(root.right, min_value) return root def find_min_value(node): while node.left: node = node.left return node.value ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值