二叉树建立及其基本操作
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()//先序建树 #代表空节点即结束 不存入
{
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;
}
方法一:按完全二叉树的层次顺序,依次输入结点信息建立二叉链表。
基本思想:一般的二叉树添加虚结点成为完全二叉树;依次输入结点信息,每进入一个字符建立一个节点,
无论是否为虚拟节点,虚拟节点下可以继续接入虚拟节点。
若是第一个结点,则令其为根结点,否则将新结点插入到它的双亲结点上。
用队列来实现这种先入先操作的数据结构,这里我就数组实现队列了。
如此重复,直到输入结束符号“\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;
}
相关文章推荐
- [数据结构] 二叉树的建立及其基本操作
- 二叉树的建立及其基本操作
- C++二叉树结构的建立与基本操作
- 二叉树的建立基本操作(链表方式)(一)
- 名称:二叉树及其基本操作
- 二叉树及其基本操作
- 实验三 二叉树的基本操作(建立)及遍历
- 数据结构(C语言实现) - 二叉树的基本操作(建立,遍历,结点数,叶子结点数,高度,按树状打印,输出叶子结点等)
- 二叉树 及其基本操作
- 二叉树的建立和基本操作
- 二叉树的建立和基本操作<一>
- 二叉树的建立和基本操作
- 二叉树的建立与基本操作
- 二叉树及其基本操作
- 二叉树的建立(非递归建立与定义建立)与基本操作(广度和深度遍历,求叶子树高)实现
- 二叉树基本操作的递归实现(二叉树建立,先序,中序,后序,深度的递归遍历。广度优先,高度优先的非递归遍历)
- 树 二叉树的建立和基本操作
- 线性表的基本操作实现及其应用之顺序表的建立与操作实现
- C++二叉树结构的建立与基本操作
- 10. 二叉树的建立与基本操作