首页 > 其他分享 >二叉树的基本操作

二叉树的基本操作

时间:2024-05-27 18:58:50浏览次数:25  
标签:right return BTNode 二叉树 基本操作 NULL root left

一、什么是二叉树:

二叉树的介绍在上上章《数据结构-----堆的实现与操作》中有讲到,不知道的可以去那里看看

二、二叉树的基本结构

typedef int BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType data; // 当前节点值域
	struct BinaryTreeNode* left; // 指向当前节点左孩子
	struct BinaryTreeNode* right; // 指向当前节点右孩子
}BTNode;

如上代码所示:在二叉树中,有着当前节点值域   指向当前节点左孩子   指向当前节点右孩子这三个来维护二叉树。

三、二叉树的遍历:

       首先要创建一个二叉树,这里直接手动创建,就不用插入法了。

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	node->data = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

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

	node1->left = node2;
	node1->right = node4;

	node2->left = node3;

	node4->left = node5;
	node4->right = node6;

	return node1;
}

       创建出来的图为:

         1、前序遍历:

前序遍历的顺序是先遍历一个树的根,然后在是它的左子树,最后是它的右子树。

前序遍历基本就是这样的:先访问节点位置,在找左树的位置。

这时就把这个左树看作整个树,对这个左树进行先访问节点位置,在找左树以此类推;

直到最后左树为空时,就返回到上一个树的节点位置,此时再往右走,然后右边走到空时,在返回。

这个时候,此时的数就走完了,再作为上一个树的左树返回,再走右树即可。

void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	printf("%d ", root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}

2、中序遍历:

中序遍历的顺序是先遍历一个二叉树的左子树,然后在是这个树的根,最后是它的右子树。

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);

}

3、后序遍历:

后序遍历的顺序是先遍历一个二叉树的左子树,然后在是它的右子树,最后是这个树的根。

void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);

}

四、二叉树的操作:

        1、计算二叉树中节点的个数:

思路:

在新函数中判断树根(root)是否为空,如果为空返回0,否则返回这个树的左子树和右子树在加上这个树根节点本身的1.

int TreeSize(BTNode* root)
{   
    return root == NULL ? 0 : TreeSize(root->left) + TreeSize(root->right) + 1;   
}

        2、计算这个二叉树的高度:

思路:

先判断如果root等于0的话,那么就返回0,

否则就定义一个整型变量进行一个递归操作记录这个树的左子树的高度,

然后再定义一个整型变量进行一个递归操作记录这个树的右子树的高度,

再用一个三目操作符返回,返回那个更高的那个数再加上这个树根1。

int TreeHeight(BTNode* root)
{
	if (root == NULL)
		return 0;
	int leftHeight = TreeHeight(root->left);
	int rightHeight = TreeHeight(root->right);

	return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

3、计算二叉树第k层的节点个数

思路:

首先进行判断,如果这个树根为空,那么就返回0,

进行递归操作:

直接返回这个树根的左子树的(k-1)层的个数 加上右子树的(k-1)层的个数

如果我递归时将k递归到1时就返回1

int TreeKLevel(BTNode* root, int k)
{
	assert(k > 0);
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}

五、完整代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>


typedef int BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType data; // 当前节点值域
	struct BinaryTreeNode* left; // 指向当前节点左孩子
	struct BinaryTreeNode* right; // 指向当前节点右孩子
}BTNode;

BTNode* BuyNode(BTDataType x)
{
	BTNode* node = (BTNode*)malloc(sizeof(BTNode));
	if (node == NULL)
	{
		perror("malloc fail");
		return NULL;
	}
	node->data = x;
	node->left = NULL;
	node->right = NULL;

	return node;
}

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

	node1->left = node2;
	node1->right = node4;

	node2->left = node3;

	node4->left = node5;
	node4->right = node6;

	return node1;
}

void PreOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	printf("%d ", root->data);
	PreOrder(root->left);
	PreOrder(root->right);
}

void InOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	InOrder(root->left);
	printf("%d ", root->data);
	InOrder(root->right);

}


void PostOrder(BTNode* root)
{
	if (root == NULL)
	{
		printf("NULL ");
		return;
	}

	PostOrder(root->left);
	PostOrder(root->right);
	printf("%d ", root->data);

}

int TreeSize(BTNode* root)
{
	return root == NULL ? 0 : 
		TreeSize(root->left) 
		+ TreeSize(root->right) 
		+ 1;
}

int TreeHeight(BTNode* root)
{
	if (root == NULL)
		return 0;
	int leftHeight = TreeHeight(root->left);
	int rightHeight = TreeHeight(root->right);

	return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}

int TreeKLevel(BTNode* root, int k)
{
	assert(k > 0);
	if (root == NULL)
		return 0;
	if (k == 1)
		return 1;
	return TreeKLevel(root->left, k - 1) + TreeKLevel(root->right, k - 1);
}

int main()
{
	BTNode* root = CreatTree();
	PreOrder(root);
	printf("\n");
	InOrder(root);
	printf("\n");
	PostOrder(root);
	printf("\n");

	
	printf("treesize = %d\n", TreeSize(root));
	
	printf("TreeKLevel = %d\n", TreeKLevel(root,3));
	return 0;
}

标签:right,return,BTNode,二叉树,基本操作,NULL,root,left
From: https://blog.csdn.net/2303_80828380/article/details/139156967

相关文章

  • 【数据结构】链式二叉树(超详细)
    文章目录前言二叉树的链式结构二叉树的遍历方式二叉树的深度优先遍历前序遍历(先根遍历)中序遍历(中根遍历)后序遍历(后根遍历)二叉树的广度优先遍历层序遍历二叉树链式结构接口实现二叉树结点个数二叉树叶子结点个数二叉树的深度(高度)二叉树第k层结点个数二叉树查找x......
  • 算法训练 | 二叉树Part3 | 104.二叉树的最大深度、111.二叉树的最小深度、222.完全二
    目录104.二叉树的最大深度递归法⭐迭代法111.二叉树的最小深度递归法⭐迭代法222.完全二叉树的节点个数普通二叉树完全二叉树嵌入式学习分享个人主页:Orion嵌入式随想录-小红书(xiaohongshu.com)104.二叉树的最大深度题目链接:104.二叉树的最大深度-力扣(Le......
  • 算法训练 | 二叉树Part4 | 10.平衡二叉树、257.二叉树的所有路径、404.左叶子之和
    目录110.平衡二叉树递归法迭代法257.二叉树的所有路径递归法迭代法404.左叶子之和递归法迭代法110.平衡二叉树题目链接:leetcode.cn文章讲解:代码随想录递归法解题思路高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。要求......
  • 算法训练 | 二叉树Part2 | 层序遍历、226.翻转二叉树、101.对称二叉树
    目录广度优先226.翻转二叉树递归法⭐迭代法层序法101.对称二叉树后序遍历法⭐迭代法嵌入式学习分享个人主页:Orion嵌入式随想录-小红书(xiaohongshu.com)广度优先解题思路层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。需要借用一个辅助数据......
  • 104.二叉树的最大深度
    给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明:叶子节点是指没有子节点的节点。示例:给定二叉树[3,9,20,null,null,15,7],返回它的最大深度3。代码:(递归法)#Definitionforabinarytreenode.#classTreeNode:......
  • 链式二叉树的前,中,后序遍历 AND 结点个数及高度等 文末附带全部代码
    目录前言1.前序遍历2.中序遍历3.后续遍历4.二叉树结点的个数5.二叉树叶子结点个数6.二叉树的高度7.二叉树第K层结点的个数8.二叉树查找值为x的结点全部代码总结正文开始前言本文旨在介绍二叉树的链式存储中一些函数的实现博客主页:酷酷学!!!更多文章,......
  • 【考研数据结构知识点详解及整理——C语言描述】第二章线性表的定义和基本操作
    25计算机考研,数据结构知识点整理(内容借鉴了王道408+数据结构教材),还会不断完善所整理的内容,后续的内容也会不断更新(可以关注),若有错误和不足欢迎各位朋友指出!目录 一.线性表的定义二.线性表的基本操作一.线性表的定义(1)线性表是具有相同数据类型的n(n>0)个数据元素的有......
  • 二叉树遍历算法与堆数据结构详解(C语言)
    目录树的概念及结构二叉树的概念及结构概念二叉树的性质满二叉树和完全二叉树满二叉树完全二叉树深度的计算二叉树顺序结构及实现顺序存储堆的概念数组建堆向下调整堆的实现完整代码Heap.hHeap.cTest.c堆的初始化(实现小堆为例)插入数据删除堆顶的数据 ......
  • 二叉树的基本功能(代码实现)
    1.二叉树的概念在对树的介绍一文中,有明确的介绍。如有兴趣可移步至:数据结构:树的介绍-CSDN博客2.二叉树的代码实现2.1二叉树的结构体typedefintBTDataType;typedefstructBinaryTreeNode{ BTDataTypedata; structBinaryTreeNode*left; structBinaryTreeNo......
  • 代码随想录算法训练营第第18天 | 513.找树左下角的值 、112. 路径总和 、106.从中
    找树左下角的值本地递归偏难,反而迭代简单属于模板题,两种方法掌握一下题目链接/文章讲解/视频讲解:https://programmercarl.com/0513.找树左下角的值.html/***Definitionforabinarytreenode.*functionTreeNode(val,left,right){*this.val=(val===undef......