二叉排序树的建立 前序 中序 后序 遍历

二叉排序树的建立 前序 中序 后序 遍历

主要根据文档《大话数据结构》

题目描述

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

输入描述:

输入第一行包括一个整数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 

 

先理解 C中 *   & 的区别

看代码:

#include<iostream>
using namespace std;

int main(){
    /*
     * &b 是指的是 b 这个地址 &b = 1 表示的是 b 这个内容是1
     * *c 指的是 *c 是整个对象 *c = 1 表示*c 整个的值是1 c 表示地址
     */
   int a = 123;
   int &b = a;
   int *c;
   c = &b;

   cout<<"a: "<<a<<" b: "<<b<<" c: "<<*c<<endl;

}

 

再看解决此题代码:

 

#include<iostream>
#include<stdlib.h>
using namespace std;

typedef struct  BiNode
{
    int data;
    struct BiNode *lch, *rch;
} BiNode, *BiTree;

/*
 * 二叉排序树  插入数据原理
 *  1)若 b是空树, 返回false
    2)若 找到  返回true
    3)比当前节点小,那么进行搜索 找到 最后那个左孩子,右孩子都为空的节点
    4)和找到都那个节点进行 比较 判断新节点是要放在和这个
 */
bool searhBST(BiTree root , int data , BiTree f, BiTree &p)
{
    if(!root)
    {
        // root 是二叉树都根节点
        // f 是要返回都节点 p 是新建节点
        p = f;
        return false;
    }
    else  if(data == root->data)
    {
        //当前节点已经存在
        p = root;
        return true;
    }
    else if(data < root->data)
    {
        //这里都第三个参数不是f 而是 root 表示都是没有data = =->value,会返回最后找到的那个左子树或者右子树为空的节点
        return searhBST(root->lch, data, root, p);
    }
    else
    {
        return searhBST(root->rch, data, root, p);
    }
}

void InsertBST(BiTree &root , int key)
{

    BiTree p, newp;
    if(!searhBST(root, key, NULL, p))
    {
        // 当前节点 已经存在的话就不用 新建一个节点
        newp = (BiTree)malloc(sizeof(BiNode));
        newp->data = key;
        newp->lch = NULL;
        newp->rch = NULL;

        if(!p)
        {
            //当前树空才会返回p是NULL
            root = newp;
        }
        else if(key < p->data)
        {
            p->lch = newp;
        }
        else
        {
            p->rch = newp;
        }
    }
}
void  preOrder(BiTree root)
{
    if(root)
    {
        cout<<root->data<<" ";
        preOrder(root->lch);
        preOrder(root->rch);
    }
}
void postOrder(BiTree root)
{
    if(root)
    {
        postOrder(root->lch);
        postOrder(root->rch);
        cout<<root->data<<" ";
    }
}
void inOrder(BiTree root)
{
    if(root)
    {
        inOrder(root->lch);
        cout<<root->data<<" ";
        inOrder(root->rch);
    }


}
int main()
{

    int n ;
    while(cin>>n)
    {
        BiTree root = NULL;
        for(int i = 0; i < n; i++)
        {
            int num;
            cin>>num;
            InsertBST(root, num);
        }
        preOrder(root);
        cout<<endl;
        inOrder(root);
        cout<<endl;
        postOrder(root);
        cout<<endl;
    }

}

 

 

模板代码:

void BFS(Node *Root)
{
    queue<Node*> Q;//队列的声明
    Node * node ;
    Q.push(Root);//先压入整棵树的根节点Root
    while(!Q.empty())//如果队列不空则一直进行下去
    {

        node = Q.front();//访问队列的第一个元素
        cout<<node->Value<<" ";//输出当前节点的值
        if (node->Left!=NULL)
        {
            Q.push(node->Left);  //如果左节点不为空则压入左节点
        }
        if (node->Right!=NULL)
        {
            Q.push(node->Right); //如果右节点不为空则压入右节点
        }
        Q.pop();  //弹出当前节点
    }
    cout<<endl;
}

 

先序遍历

void PreOrderTraverse(BiTree T)
{
   if(T)//如果当前节点不为空
   {
      printf("%d ",T->data);     //先输出当前节点的值
      PreOrderTraverse(T->Left); //再调用自己到左节点
      PreOrderTraverse(T->Right);//最后到右节点
   }
   return;
}

中序遍历

void InOrderTraverse(BiTree T)
{
   if(T)//如果当前节点不为空
   {
      PreOrderTraverse(T->Left);    //先调用自己到左节点
      printf("%d ",T->data);       //再输出当前节点的值
      PreOrderTraverse(T->Right);   //最后到右节点
   }
}

后续遍历

void PostOrderTraverse(BiTree T)
{
   if(T)//如果当前节点不为空
   {
      PreOrderTraverse(T->Left);   //先调用自己到左节点
      PreOrderTraverse(T->Right);  //再到右节点
      printf("%d ",T->data);       //最后输出当前节点的值

   }
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangxiaoming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值