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

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

 

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

 

题目描述

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

输入描述:

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

 

 

 

 

 

再看解决此题代码:

 

#include
#include
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<data<<" ";
        preOrder(root->lch);
        preOrder(root->rch);
    }
}
void postOrder(BiTree root)
{
    if(root)
    {
        postOrder(root->lch);
        postOrder(root->rch);
        cout<data<<" ";
    }
}
void inOrder(BiTree root)
{
    if(root)
    {
        inOrder(root->lch);
        cout<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<

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(ACM)