建立二叉树
建立二叉树可根据输入一个串先序、中序或后序建立,如本篇中以1 2 4 -1 -1 -1 3 5 -1 -1 -1为例,数字-1为空结点,先序、中序、后序没什么太大区别,仅仅时对结点数据赋值的时间不同,建立运用递归思想。遍历可先、中、后序,也可层序遍历。层序遍历可以运用队列,每pop出一个数据,push进相应的左右孩子。本篇中我队列用的stl模板,队列中存放每个结点指针,个人觉得这样更简单也更方便理解。
创建结点
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<queue>
using namespace std;//1 2 4 -1 -1 -1 3 5 -1 -1 -1
int cout=0;
typedef struct node{
int data;
struct node *leftchild;
struct node *rightchild;
}Tree,*Btree;
先序建立二叉树
int createtree(node* &root)//先序创建二叉树,设置当输入数字为-1时为空结点
{
int x;
scanf("%d",&x);
if(x==-1){
root=NULL;
}
else{
root=(node*)malloc(sizeof(node));
root->data=x;cout++;
createtree(root->leftchild);
createtree(root->rightchild);//cout++;
}
return cout;//设置全局变量cout记录新创结点数
}
遍历:
void firstfind(node* &root)//先序遍历
{
if(root)
{
printf("%4d",root->data);
firstfind(root->leftchild);
firstfind(root->rightchild);
}
}
void middlefind(node* &root)//中序遍历
{
if(root)
{
middlefind(root->leftchild);printf("%4d",root->data);
middlefind(root->rightchild);
}
}
void lastfind(node* &root)//后序遍历
{
if(root)
{
lastfind(root->leftchild);
lastfind(root->rightchild); printf("%4d",root->data);
}
}
void everyfind(node* &root)//层序遍历(stl模板建立指针队列,每一个指针入队时,当左右孩子存在,压其入队)
{
queue<node*>q;
q.push(root);
while(!q.empty())
{
printf("%4d",q.front()->data);
if(q.front()->leftchild)q.push(q.front()->leftchild);
if(q.front()->rightchild)q.push(q.front()->rightchild);
q.pop();//pop掉队首指针
}
}
主函数:
int main()
{
Btree root;
createtree(root);
printf("先序遍历:\n");
firstfind(root);
printf("\n");
printf("中序遍历:\n");
middlefind(root);
printf("\n");
printf("后序遍历:\n");
lastfind(root);
printf("\n");
printf("层序遍历:\n");
everyfind(root);
printf("\n");
printf("建立了%d个节点\n",cout);
return 0;
}
注意:每次传进去的root要取地址&而非*,传地址可以直接改变指针相应数据,因为这个小问题费了好多不必要的时间检查,好坑啊~~