二叉树的创建及3种遍历

二叉树概念

把满足一下2个条件的树结构称为二叉树(Binary Tree):

  1. 每个结点的度都不大于2。
  2. 每个结点的孩子结点次序不能任意颠倒。
性质
  1. 在二叉树的第 i 层上至多有2i-1 个结点(i >= 1)。
  2. 深度为 k 的二叉树至多有2k-1个结点。
  3. 对任意一棵二叉树T,若终端结点数(叶子结点)为n0,而其度为2的结点数为n2,则n0=n2+n1。( ☆☆☆☆☆)
  4. 具有n个结点的完全二叉树的深度为 ⌊ log2n⌋+1( ⌊ ⌋是下取整符号(floor) ) 。
存储结构

1.顺序存储
在这里插入图片描述
在这里插入图片描述
2. 链式存储

若一个二叉树含有n个结点,则它的二叉链表中必含有2n个指针域,其中必有n+1个空链域

结构
typedef struct Node{
	DataType data;
	struct Node *LChild;
	struct Node *RChild;
}BiTNode, *BiTree; 
创建
void CreatBiTree(BiTree *bt){
	char a;
	a = getchar();
	if(a == ' ')
	(*bt)= NULL;
	else{
		(*bt )=(BiTree)malloc(sizeof(BiTNode));
		(*bt)->date=a;
		CreatBiTree(&((*bt)->LChild));
		CreatBiTree(&((*bt)->RChild));
	}
}
遍历

1.先序遍历(DLR)

void PreOrder(BiTree root){
	if(root != NULL){
		Visit(root->data);
		PreOrder(root->LChild);
		PreOrder(root->RChild);
	}
}

2.中序遍历(LDR)

void InOrder(BiTree root){
	if(root != NULL){
		InOrder(root->LChild);
		Visit(root->data);
		InOrder(root->RChild);
	}
}

3.后序遍历(LRD)

void PostOrder(BiTree root){
	if(root != NULL){
		PostOrder(root->LChild);
		PostOrder(root->RChild);
		Visit(root->data);
	}
}
用例

在这里插入图片描述
首先要把树转变为二叉树

  1. 树中所有相邻兄弟之间加一条线。
  2. 对树中的每个结点,只保留与其第一个孩子结点之间的连线,删去其与其他孩子结点之间的连线。
  3. 以树的根结点为轴心,将整棵树顺时针旋转一定角度,使之结构层次分明。

图中树变为二叉树如下图所示
在这里插入图片描述
由ABEFCGD输出得知二叉树采用先序遍历,问题的难点在于结点前的空格数,经过观察,得到一个规律,结点的左孩子的空格数比结点大1,右孩子结点的空格数和结点相等。
在这里插入图片描述

#include<stdio.h> 
#include<stdlib.h> 
typedef struct Node{
	char date;
	int num; 
	struct Node *LChild;
	struct Node *RChild;
}BiTNode, *BiTree;
//建表 
void CreatBiTree(BiTree *bt){
	char a;
	a = getchar();
	if(a == '#')
	(*bt)= NULL;
	else
	{
		(*bt )=(BiTree)malloc(sizeof(BiTNode));
		(*bt)->date=a;
		CreatBiTree(&((*bt)->LChild));
		CreatBiTree(&((*bt)->RChild));
	}
}
//k代表空格数,初始为 0 
void Init(BiTree root,int k){
	root->num=k;	
}
void PreOrder(BiTree root){
	if(root){
		if(root->LChild)//左孩子 +1 
			root->LChild->num=root->num+1;	
		if(root->RChild)//右孩子空格数 = 父结点 空格数
			root->RChild->num=root->num; 
		PreOrder(root->LChild);
		PreOrder(root->RChild);	
	}	
}
void PrintTree(BiTree root){
	if(root!=NULL){
		for(int i=0;i<root->num;i++)
		printf("  "); 
		printf("%c\n",root->date);
		PrintTree(root->LChild);
		PrintTree(root->RChild);
	}
}
int main(){
	BiTree bt;
	printf("Enter: ABE#F##CG##D###\n"); 
	CreatBiTree(&bt);
	Init(bt,0);
	PreOrder(bt);
	PrintTree(bt);
}
 

运行结果:
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃鱼的ねこ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值