二叉树的定义在此不再赘述:
https://baike.so.com/doc/4343861-4548914.html
二叉树的建立
首先,要先声明一个树的结构,也就是树的结构体,要有数据域data,左指针域Lchild,右指针域Rchild,在此给结构重新起名,结点为TNode,指向结点的指针为BiTree
参考代码:
typedef struct TNode
{
int data;
struct TNode * Lchild;
struct TNode * Rchild;
}TNode,*BiTree;
其次,我们就要建立几个结点,并将它们链接起来,实际上还是指针的指向性问题,指针指向谁,就将谁的地址赋值给指针,先初始化几个结点指针pi[i=1-5],对地址初始化,并给它们的值域赋一定的值。

之后将它们按照这个连接起来
BiTree p1,p2,p3,p4,p5;
p1 = (BiTree)malloc(sizeof(TNode));
p2 = (BiTree)malloc(sizeof(TNode));
p3 = (BiTree)malloc(sizeof(TNode));
p4 = (BiTree)malloc(sizeof(TNode));
p5 = (BiTree)malloc(sizeof(TNode));
memset(p1,0,sizeof(TNode));
memset(p2,0,sizeof(TNode));
memset(p3,0,sizeof(TNode));
memset(p4,0,sizeof(TNode));
memset(p5,0,sizeof(TNode));
p1->data = 1;
p2->data = 2;
p3->data = 3;
p4->data = 4;
p5->data = 5;
p1->Lchild = p2;
p1->Rchild = p3;
p2->Lchild = p4;
p3->Lchild = p5;
二叉树的遍历:
遍历采用递归算法,假如是先序遍历,就是根,左子树,右子树(DLR)
代码:
void preTraverseBiTree(BiTree &T)
{
if(T)
{
cout<<T->data<<" ";
preTraverseBiTree(T->Lchild);
preTraverseBiTree(T->Rchild);
}
}
中序和后序性质相同,只是根节点的遍历顺序不同,但是三种方法没有区别
具体程序实现代码和递归建立二叉树和访问二叉树代码,欢迎提议
#include <iostream>
#include <cstdlib>
#include <cstring>
using namespace std;
typedef struct TNode
{
int data;
struct TNode * Lchild;
struct TNode * Rchild;
}TNode,*BiTree;
void preTraverseBiTree(BiTree &T)
{
if(T)
{
cout<<T->data<<" ";
preTraverseBiTree(T->Lchild);
preTraverseBiTree(T->Rchild);
}
}
int main()
{ BiTree p1,p2,p3,p4,p5;
p1 = (BiTree)malloc(sizeof(TNode));
p2 = (BiTree)malloc(sizeof(TNode));
p3 = (BiTree)malloc(sizeof(TNode));
p4 = (BiTree)malloc(sizeof(TNode));
p5 = (BiTree)malloc(sizeof(TNode));
memset(p1,0,sizeof(TNode));
memset(p2,0,sizeof(TNode));
memset(p3,0,sizeof(TNode));
memset(p4,0,sizeof(TNode));
memset(p5,0,sizeof(TNode));
p1->data = 1;
p2->data = 2;
p3->data = 3;
p4->data = 4;
p5->data = 5;
p1->Lchild = p2;
p1->Rchild = p3;
p2->Lchild = p4;
p3->Lchild = p5;
cout<<"所建立二叉树的先根遍历顺序为:"<<endl;
preTraverseBiTree(p1);
system("pause");
}
#include <iostream>
using namespace std;
typedef struct node {
struct node* lchild;//左指针域
struct node* rchild;//右指针域
char data;//数据域
} BiTreeNode,*BiTree;
//按照前序顺序建立二叉树
//根
//左子树
//右子树
void createBiTree(BiTree &T)//&是节点指针的引用
{
char c;
cin>>c;
if(c == '#') { //遇到"#" 令树的根节点为NULL
T = NULL;//根
} else {
T = new BiTreeNode;
T->data = c;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
//前序遍历二叉树并打印二叉树
//思想依然是递归
void PreTraverse(BiTree T)
{
if(T) {
cout<<T->data<<" ";
PreTraverse(T->lchild);
PreTraverse(T->rchild);
}
}
//中序遍历并打印
//左子树
//根
//右子树
void midTraverse(BiTree T)
{
if(T) {
midTraverse(T->lchild);
cout<<T->data<<" ";
midTraverse(T->rchild);
}
}
//后根遍历
//左子树
//右子树
//根节点
void postTraverse(BiTree T)
{
if(T) {
postTraverse(T->lchild);
postTraverse(T->rchild);
cout<<T->data<<" ";
}
}
int main()
{
BiTree T; //声明一个指向二叉树根节点的指针
createBiTree(T);
cout<<"二叉树创建完成!"<<endl;
cout<<"前序遍历二叉树:"<<endl;
PreTraverse(T);
cout<<endl;
cout<<"中序遍历二叉树:"<<endl;
midTraverse(T);
cout<<endl;
cout<<"后序遍历二叉树:"<<endl;
postTraverse(T);
return 0;
}