您的位置:首页 > 其它

二叉树建立及其基本操作

2016-11-13 18:11 363 查看
二叉树的建立

方法一:按完全二叉树的层次顺序,依次输入结点信息建立二叉链表。

基本思想:一般的二叉树添加虚结点成为完全二叉树;依次输入结点信息,每进入一个字符建立一个节点,

无论是否为虚拟节点,虚拟节点下可以继续接入虚拟节点。

若是第一个结点,则令其为根结点,否则将新结点插入到它的双亲结点上。

用队列来实现这种先入先操作的数据结构,这里我就数组实现队列了。

如此重复,直到输入结束符号“\0”时停止(假设结点数据域为字符型)。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

typedef struct bittree
{
char data;
struct bittree *lc, *rc;
}Bittree, *Bit;

Bit Createtree()//按层建树 #代表虚拟节点可以在相面继续加值
{
int front, rear;
char ch;
Bit Q[100], T;
ch = getchar();
T = NULL;
front = 1;
rear = 0;
while(ch != '\n')
{
Bit s = NULL;
s = (Bit)malloc(sizeof(Bittree));
s->data = ch;
s->lc = s->rc = NULL;
rear++;
Q[rear] = s;
if(rear == 1)
T = s;
else if(Q[front] != NULL&&rear != 1)
{
if(rear%2 == 0)
{
Q[front]->lc = s;
}
else
{
Q[front]->rc = s;
front ++;
}
}
ch = getchar();
}
return T;//还是正常return吧,别直接传指针地址了,蒙圈了
}

void Pre_outtree(Bit T)//DLR
{
if(T&&T->data!='#')
{
printf("%c", T->data);
Pre_outtree(T->lc);
Pre_outtree(T->rc);
}
}

void In_outtree(Bit T)//LDR
{
if(T&&T->data!='#')
{
In_outtree(T->lc);
printf("%c", T->data);
In_outtree(T->rc);
}
}

void Post_outtree(Bit T)//LRD
{
if(T&&T->data!='#')
{
Post_outtree(T->lc);
Post_outtree(T->rc);
printf("%c", T->data);
}
}

int num = 0;
void Countleave(Bit T)//深搜寻找叶子 1
{
if(T&&T->data!='#')
{
if(T->lc == NULL)
{
if(T->rc == NULL)
{
num++;
return;
}
else if(T->rc->data == '#')
{
num++;
return;
}
}
else if(T->lc->data == '#')
{
if(T->rc == NULL)
{
num++;
return;
}
else if(T->rc->data == '#')
{
num++;
return;
}
}
Countleave(T->lc);
Countleave(T->rc);
}
}

void Lowup_out(Bit T, int space)
{
if(T&&T->data!='#')
{
for(int i = 0; i<space; i++)
printf("    ");
printf("%c\n", T->data);
Lowup_out(T->lc, space+1);
Lowup_out(T->rc, space+1);
}
}

Bit Change(Bit T)
{
if(T&&T->data!='#')
{
Change(T->lc);
Change(T->rc);
Bit s;//求交换树
s = T->lc;
T->lc = T->
4000
;rc;
T->rc = s;
}
return T;
}

void Output(Bit T)
{
Lowup_out(T, 0);
printf("pre_sequence  : ");
Pre_outtree(T);
printf("\n");
printf("in_sequence   : ");
In_outtree(T);
printf("\n");
printf("post_sequence : ");
Post_outtree(T);
printf("\n");
}

int main()
{
Bit T;
T = Createtree();
printf("BiTree\n");
Output(T);//几种输出操作
printf("Number of leaf: ");
Countleave(T);
printf("%d\n", num);
T = Change(T);//求交换树
printf("BiTree swapped\n");
Output(T);
return 0;
}

方法二:先序建立二叉树

这种方法是按照先序的方式输入,进而建立二叉树。

为递归的思想:存入一个根节点之后他的两个孩子可以继续构成子树的根节点,进而建立递归

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

typedef struct bittree
{
char data;
struct bittree *lc, *rc;
}Bittree, *Bit;

Bit Createtree()//先序建树 #代表空节点即结束 不存入
{
char ch;
scanf("%c", &ch);
Bit T;
if(ch == '#')
T = NULL;
else
{
T = (Bit)malloc(sizeof(Bittree));
T->data = ch;
T->lc = Createtree();
T->rc = Createtree();
}
return T;
}

void Pre_outtree(Bit T)//DLR
{
if(T)
{
printf("%c", T->data);
Pre_outtree(T->lc);
Pre_outtree(T->rc);
}
}

void In_outtree(Bit T)//LDR
{
if(T)
{
In_outtree(T->lc);
printf("%c", T->data);
In_outtree(T->rc);
}
}

void Post_outtree(Bit T)//LRD
{
if(T)
{
Post_outtree(T->lc);
Post_outtree(T->rc);
printf("%c", T->data);
}
}

//int num = 0;
//void Countleave(Bit T)//深搜寻找叶子 1
//{
// if(T)
// {
// if(T->lc == NULL&&T->rc == NULL)
// {
// num++;
// return;
// }
// Countleave(T->lc);
// Countleave(T->rc);
// }
//}

int Countleave(Bit T)//递归寻找叶子数 2
{
if(!T)
return 0;
if(T->lc == NULL&&T->rc == NULL)
return 1;
else
{
return Countleave(T->lc) + Countleave(T->rc);
}
}

void Lowup_out(Bit T, int space)
{
if(T)
{
for(int i = 0; i<space; i++)
printf(" ");
printf("%c\n", T->data);
Lowup_out(T->lc, space+1);
Lowup_out(T->rc, space+1);
}
}

Bit Change(Bit T)
{
if(T)
{
Change(T->lc);
Change(T->rc);
Bit s;//求交换树
s = T->lc;
T->lc = T->rc;
T->rc = s;
}
return T;
}

void Output(Bit T)
{
Lowup_out(T, 0);
printf("pre_sequence : ");
Pre_outtree(T);
printf("\n");
printf("in_sequence : ");
In_outtree(T);
printf("\n");
printf("post_sequence : ");
Post_outtree(T);
printf("\n");
}

int main()
{
Bit T;
T = Createtree();
printf("BiTree\n");
Output(T);//几种输出操作
printf("Number of leaf: ");
// Countleave(T);
// printf("%d\n", num);
printf("%d\n", Countleave(T));
T = Change(T);//求交换树
printf("BiTree swapped\n");
Output(T);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: