二叉排序树的建立 前序 中序 后序 遍历
主要根据文档《大话数据结构》
题目描述
输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历。
输入描述:
输入第一行包括一个整数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); //最后输出当前节点的值
}
}