二叉链表实现

1 二叉链表的创建

也称链式二叉树

我们可以实现一个这样的二叉树

经过调试我们可以看到确实是我们的期望的样子

2 二叉树的遍历

想必大家有点怀疑这个二叉树的遍历是什么东西 , 下面给大家来了解一下

1) 先根遍历

在排序的时候是根据 根结点 在前 左右孩子顺序 --------------也可以理解为 根 左 右

知道这样理解大家还是不会明白 我举一个例子 就由上面我们实现的

代码如下

我们来看看是不是和我们开始预期的一样

大家还记得在前面c语言中讲到的递归吗?

二叉树就是遵循递归的规律 下面我给大家画一下。

2)中根遍历

中根就是把根节点放在左右孩子的中间 ------------------ 左 根 右

中根遍历的代码也是递归的

代码也是和前根类似

3)后根遍历

后根就是把根根结点放最后面 ------------------------- 左 右 根

遇事不决,可问春风,春风不语 ,既随本心。

4)二叉树中的结点个数

大概的图是这样的。

5)二叉树中叶子结点的个数

叶子结点就是 :左右子树都为空的点 也称度为0的节点

下面代码可以这样写

这里打印出叶子节点是3个

6)二叉树第看k层的节点个数

第三层得出是两个节点

由上面我们可以得出当k=1层是就是该层 ,

得出的结果和我们分析的一样

7)二叉树的深度/高度

高度是根据左子树 或者右子树上哪个层次高来决定的

8)在二叉树中找值为x的 节点

废话不多说看代码

结果和我们预期一样

9)二叉树的销毁

下面是二叉树的代码

text.c

cpp 复制代码
#include "Tree.h"
BTNode* BuyNode(BTDatatype x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		exit(1);
	}
	node->data = x;
	node->leftchild = node->rightchild = NULL;
	return node;
}


void  text01()
{
	//创建节点

	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);

	//将节点都链接起来
	node1->leftchild = node2;
	node1->rightchild = node3;
	node2->leftchild = node4;
	node2->rightchild = node5;

	/*PreOrder(node1);
	printf("\n");*/
	INOrder(node1);
	printf("\n");
	PostOrder(node1);
	printf("\n");
	//printf("size %d\n", BinaryTreeSize(node1));
	/*printf("leafsize %d\n", BinaryTreeleafSize(node1));
	printf("Ksize %d\n",BinaryTreeLevelKSize(node1, 3));*/
	//printf("depth %d\n", BinaryTreeDepth(node1));
	BTNode* find = BinaryTreeFind(node1, 8);
	if (find == NULL)
	{
		printf("没找到\n");
	}
	else
		printf("找到了\n");


	BinaryTreeDestory(&node1);
}
int main()
{
	text01();


	return 0; 
}

BinaryTree.c

cpp 复制代码
#include "Tree.h"
void  PreOrder( BTNode * root)
{
	if (root == NULL)
	{
		return;

	}
	printf("%d ", root->data);
	PreOrder(root->leftchild);
	PreOrder(root->rightchild);
	
}
void INOrder( BTNode * root)
{
	if (root == NULL)
	{
		return;

	}

	INOrder(root->leftchild);
	printf("%d ", root->data);
	INOrder(root->rightchild);

}

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{

		return;
	}
	PostOrder(root->leftchild);
	PostOrder(root->rightchild);
	printf("%d ", root->data);
}

int  BinaryTreeSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;
	}


	return BinaryTreeSize(root->leftchild) + BinaryTreeSize(root->rightchild) + 1;

}


int  BinaryTreeleafSize(BTNode* root)
{
	if (root == NULL)
	{
		return 0;

	}
	
	if (root->leftchild == NULL && root->rightchild == NULL)//判断是不是叶子结点
	{
		return 1;
	}

	return BinaryTreeleafSize(root->leftchild) + BinaryTreeleafSize(root->rightchild);//遍历左右子树
}


int BinaryTreeLevelKSize(BTNode* root,int k )
{
	if (root == NULL)
	{
		return 0;
	}

	if (k == 1)//k等于1的时候代表k就是第几行
	{
		return 1;
	}
	//每一次调用 k都要减一
	return BinaryTreeLevelKSize(root->leftchild,k-1) + BinaryTreeLevelKSize(root->rightchild,k-1);
}

int  BinaryTreeDepth(BTNode* root)
{
	if (root == NULL)
	{

		return 0;
	}
	//遍历左子树
	int leftdep = BinaryTreeDepth(root->leftchild);
	int rightdep = BinaryTreeDepth(root->rightchild);


	//如果是左子树大 那么就返回左子树+1 ,右子树大返回右子树+1
	return leftdep > rightdep ? leftdep + 1 : rightdep + 1;

}





BTNode * BinaryTreeFind(BTNode* root, BTDatatype x)
{
	if (root == NULL)
	{
		return NULL;
	}


	if (root->data== x)
	{
	
		return root;
	}
	 BTNode * leftfind= BinaryTreeFind(root->leftchild, x);
	 if (leftfind)//左子树不为空
	 {

		 return leftfind;

	}
	 BTNode * rightfind = BinaryTreeFind(root->rightchild, x);
	 if (rightfind)//右子树不为空
	 {

		 return rightfind;
	}
	 //走到这里就是没有找到
	 return NULL;
}


void  BinaryTreeDestory(BTNode** root)
{
	if (*root == NULL)
	{
		return;
	}
	//这里的(*root)->leftchild 是一级指针  我们的root 的参数是二级指针  这里也就是穿一级指针的地址
	BinaryTreeDestory(&((*root)->leftchild));	
	BinaryTreeDestory(&((*root)->rightchild));
	free(*root);
	*root = NULL;


}

BinaryTree.h

cpp 复制代码
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
//定义二叉树结构
typedef int BTDatatype;
 typedef struct BinaryTreeNode
{
	 BTDatatype data;
	struct BinaryTreeNode* leftchild;
	struct BinaryTreeNode* rightchild;
} BTNode;


 //先序遍历
 void  PreOrder(BTNode* root);
 //中跟遍历
 void INOrder(BTNode* root);
 //后跟遍历
 void PostOrder(BTNode* root);
 //二叉树中结点的个数
 int  BinaryTreeSize(BTNode * root);
 //二叉树叶子节点个数
 int  BinaryTreeleafSize(BTNode * root);
 //二叉树第k层节点个数
 int BinaryTreeLevelKSize(BTNode* root ,int k);
 //二叉树的深度/高度
 int  BinaryTreeDepth(BTNode* root);
 //二叉树找值为x的节点
 BTNode *  BinaryTreeFind(BTNode* root, BTDatatype x);
 //二叉树的销毁
 void  BinaryTreeDestory(BTNode** root);
相关推荐
paeamecium1 小时前
【PAT甲级真题】- Recover the Smallest Number (30)
数据结构·算法·pat考试·pat
玛丽莲茼蒿1 小时前
Leetcode hot100 在排序数组中查找元素的第一个和最后一个位置【中等】
数据结构·算法
寒秋花开曾相惜2 小时前
(学习笔记)4.2 逻辑设计和硬件控制语言HCL(4.2.3 字级的组合电路和HCL整数表达式)
android·网络·数据结构·笔记·学习
发疯幼稚鬼2 小时前
二叉树的广度优先遍历
c语言·数据结构·算法·宽度优先
love在水一方2 小时前
【Voxel-SLAM】Data Structures / 数据结构文档(二)
数据结构·人工智能·机器学习
Via_Neo2 小时前
乘积最大问题
数据结构·算法
自我意识的多元宇宙3 小时前
数据结构----插入排序
数据结构·算法·排序算法
im_AMBER3 小时前
Leetcode 162 除了自身以外数组的乘积 | 接雨水
开发语言·javascript·数据结构·算法·leetcode
cpp_25013 小时前
P1873 [COCI 2011/2012 #5] EKO / 砍树
数据结构·c++·算法·题解·二分答案·洛谷·csp