C Language 树 - Tree和BinaryTree(十三)

二叉树(BinaryTree)

二叉树的概念是非常的庞大,也是非常的多,小编在此总结完整知识体系

在这里插入图片描述
二叉树是一个有限的结点集合,这个集合或者为空,或者由一个根节点和两颗互不相交的称左子树和右子树的二叉树组成

注意:

  • 度为2的树中至少有一个结点的度为2,而二叉树没有这种要求。
  • 度为2的树不区分左、右子树,而二叉树是严格区分左、右子树的。
  • 在一颗二叉树中,如果所有的分支结点都有左右子树,并且叶子结点都在二叉树的最下层,这样的二叉树称为满二叉树。

二叉树性质:

  • 非空二叉树的叶子结点数等于双分支结点数加1。
  • 非空二叉树的第i层上最多有2^i - 1个结点(i>=1)
  • 高度为h的二叉树最多有2^h - 1 个结点(h>=1)
  • 具有n个结点的完全二叉树的高度为[log2(n+1)]或[log2n]+1

二叉树的存储结构:

顺序存储结构:

typedef struct SqBiTree{
	ElemType SqBiTree[MaxSize];
};

在这里插入图片描述

二叉树的链式存储结构:

typedef struct SqNode{
	ElemType data;
	struct SqNode *lchild;
	struct SqNode *rchild;
};

在这里插入图片描述

二叉树的遍历:

补充:二叉树的遍历方式是根据存储方式来的,什么样的存储方式用不同的遍历方式结果都会不同

  • 先序遍历(DLR)
    在这里插入图片描述
  • 中序遍历(DLR)

在这里插入图片描述

  • 后序遍历(LRD)

在这里插入图片描述
层次遍历:

在这里插入图片描述

(二)树、森林、二叉树的转换

  • 森林转树

如下有三颗树,分别为2次树,1次树,和3次树,将他们添加到L的双亲结点下,称为结点L的孩子结点,森林就被转换成树了。

在这里插入图片描述

  • 树转二叉树:

在这里插入图片描述

二叉树转树:

  • 有二叉树如下:

在这里插入图片描述

连接之后:

在这里插入图片描述

  • 还原如下:
    在这里插入图片描述

二、二叉树的基本算法

为了演示方便,小编采用的是括号表示法(A(B,C))

  • 创建树结构体:

typedef struct SqNode{
	char data;
	struct SqNode *lchild;
	struct SqNode *rchild;
}BTNode;
  • 创建二叉树算法:

void createBiTree(BTNode *&node , char *str){
	
	BTNode *St[MaxSize] , *p; //创建顺序栈 
	int top = -1,k,j = 0; //栈顶指针以及str数组指针 
	char ch ; 
	node = NULL;
	ch = str[j]; 
	while(ch != '\0'){  //循环遍历str数值 
		switch(ch){
			case '(':
				top++;St[top] = p;k=1;break;
			case ')':
				top--;break;
			case ',':k=2;break;
			default: p = (BTNode *)malloc(sizeof(BTNode));
			p->data = ch;
			p->lchild = p->rchild = NULL;
			if(node == NULL){
				node = p;
			}else{
				switch(k){
					case 1:St[top]->lchild = p;break;
					case 2:St[top]->rchild = p;break;
				}
			}
		}
			j++;
			ch = str[j];
	}
} 
  • 输出二叉树算法:
//输出二叉树
void dispBtree(BTNode *b){
	if(b!=NULL){
		printf("%c",b->data); 
		if(b->lchild != NULL || b->rchild != NULL){
			printf("(");
			dispBtree(b->lchild);
			if(b->rchild != NULL) printf(",");
			dispBtree(b->rchild);
			printf(")");
		}
	}
} 
  • 销毁二叉树算法:
//销毁二叉树
void  destoryBTree(BTNode *&bnode) {
	if(bnode != NULL) {
		destoryBTree(bnode->lchild);
		destoryBTree(bnode->rchild);
		free(bnode);
	}
}
  • 查找指定结点算法:
//查找结点算法
BTNode *findNode(BTNode *bnode , char ch){
	BTNode *p;
	if(bnode == NULL){
		//没有返回值了 
		return NULL;
	}else if(bnode->data == ch){
		return bnode; //找到这个结点直接返回
	}else{
		p = findNode(bnode->lchild,ch);
		if(p != NULL){
			return p;
		}else{
			return findNode(bnode->rchild,ch);
		}
	}
} 
  • 结果展示:(搜索M和搜索G元素)

在这里插入图片描述
搜索G元素

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值