BinaryTreeRelatedOperations

本文介绍了一种二叉树(包括二叉搜索树)的创建方法及遍历算法,并提供了插入节点的不同方式(递归与非递归)。此外,还讨论了如何计算二叉树的节点数与深度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<stdio.h>
#include<malloc.h>
#include<stack>
#include<iostream>

using namespace std;

typedef struct BiTreeNode
{
	int m_nValue;
	struct BiTreeNode* m_pLeft, m_pRight;
}BiTreeNode, *BiTreeList;

class BiTree
{
	static int leaves;
	static int depth;
	BiTreeNode* pRoot;
public:
	//[1].Create a new binary tree(Binary Search Tree)
	BiTreeNode* CreateBiTree(BiTreeNode* pRoot);
	void InsertBSTNode(BiTreeNode* pRoot, int value);
	void InsertBSTNode_Recursively(BiTreeNode* pRoot, int value);

	//[2].Binary Tree Traverse
	void PreorderTraverse_Recursively(BiTreeNode* pRoot);
	void PreorderTraverse(BiTreeNode* pRoot);
	void InorderTraverse(BiTreeNode* pRoot);
	void InorderTraverse_Recursively(BiTreeNode* pRoot);
	void PostorderTraverse(BiTreeNode* pRoot);
	void PostorderTraverse_Recursively(BiTreeNode* pRoot);

	//[3].Basic Operations
	int CalculateTreeNodes(BiTreeNode* pRoot);
	int BiTreeDepth(BiTreeNode* pRoot);
};

//Insert node into binary search tree
//[1].Non-Recursively
void BiTree::InsertBSTNode(BiTreeNode* pRoot, int value)
{
	BiTreeNode* pNode = new BiTreeNode();
	pNode->m_nValue = value;
	pNode->m_pLeft = pNode->m_pRight = NULL;
	
	if(pRoot == NULL)
		pRoot = pNode;
	else
	{
		BiTreeNode* pPrev;
		BiTreeNode* pCurrent = pRoot;
		while(pCurrent != NULL)
		{
			pPrev = pCurrent;
			if(pCurrent->m_nValue > value)
				pCurrent = pCurrent->m_pLeft;
			else
				pCurrent = pCurrent->m_pRight;
		}
		
		if(pPrev->m_nValue > value)
			pPrev->m_nLeft = pNode;
		else
			pPrev->m_nRight = pNode;
	}		
}

//[2]Recursively
void BiTreeNode::InsertBSTNode_Recursively(BiTreeNode* pRoot, int value)
{
	BiTreeNode* pNode = new BiTreeNode();
	pNode->m_nValue = value;
	pNode->m_pLeft = pNode->m_pRight = NULL;
	
	if(pRoot == NULL)
	{
		pRoot = pNode;
		return;
	}
	else
	{
		if(pRoot->m_nValue > value)
		{
			InsertBSTNode_Recursively(pRoot->m_pLeft, value);
		}
		else if(pRoot->m_nValue < value)
		{
			InsertBSTNode_Recursively(pRoot->m_pRight, value);
		}
		else
		{
			cout<<"Insert failed, Current node exists."<<endl;
			return;
		}
	}
}

//[1].Create a new binary tree(Binary Search Tree)
BiTreeNode* BiTree::CreateBiTree(BiTreeNode* pRoot)
{
	int value;
	cin>>value;
	if(value == -1)
		pRoot = NULL;
	else
	{
		pRoot = (BiTreeNode*) malloc(sizeof(BiTreeNode));
		pRoot->m_nValue = value;
		CreateBiTree(pRoot->m_pLeft);
		CreateBiTree(pRoot->m_pRight);
	}	
	
	return pRoot;
}

/*Traverse Binary Tree in different orders----- Recursively*/
//[1].PreorderTraverse
void BiTree::PreorderTraverse_Recursively(BiTreeNode* pRoot)
{
	if(NULL == pRoot)
		return;
	cout<<pRoot->m_nValue<<" ";
	PreorderTraverse_Recursively(pRoot->m_pLeft);
	PreorderTraverse_Recursively(pRoot->m_pRight);
}

//[2].InorderTraverse
void BiTree::InorderTraverse_Recursively(BiTreeNode* pRoot)
{
	if(NULL == pRoot)
		return;
	
	InorderTraverse_Recursively(pRoot->m_pLeft);
	cout<<pRoot->m_nValue<<" ";
	InorderTraverse_Recursively(pRoot->m_pRight);
}

//[3].PostorderTraverse
void BiTree::PostorderTraverse_Recursively(BiTreeNode* pRoot)
{
	if(NULL == pRoot)
		return;
	
	PostorderTraverse_Recursively(pRoot->m_pLeft);
	PostorderTraverse_Recursively(pRoot->m_pRight);
	cout<<pRoot->m_nValue<<" ";
}

/*Binary Tree Traverse -- Non_Recursively*/
//[1].Preorder
void visit(BiTreeNode* pRoot)
{
	if(pRoot)
	{
		cout<<pRoot->m_nValue<<" ";
	}
}

void BiTree::PreorderTraverse(BiTreeNode* pRoot)
{
	BiTreeNode* pNode = pRoot;
	stack<BiTreeNode*> nodes;
	
	while(pNode != NULL || !nodes.empty())
	{
		if(pNode != NULL)
		{
			visit(pNode);
			nodes.push(pNode);
			pNode = pNode->m_pLeft;
		}
		else
		{
			pNode = nodes.top();
			nodes.pop();
			pNode = pNode->m_pRight;
		}
	}
}

//[2].Inorder
void BiTree::InorderTraverse(BiTreeNode* pRoot)
{
	BiTreeNode* pNode = pRoot;
	stack<BiTreeNode*> nodes;
	
	while(pNode != NULL || !nodes.empty())
	{
		while(pNode != NULL)
		{
			nodes.push(pNode);
			pNode = pNode->m_pLeft;
		}
		if(!nodes.empty())
		{
			pNode = nodes.top();
			nodes.pop();
			visit(pNode);
			pNode = pNode->m_pRight;
		}
	}
}

//[3].Postorder
typedef enum{L, R}TagType;
typedef struct
{
	BiTreeNode* pNode;
	TagType tag;
}StackNode;

void BiTree::PostorderTraverse(BiTreeNode* pRoot)
{
	BiTreeNode* pNode = pRoot;
	stack<StackNode> nodes;
	StackNode snode = new StackNode();
	
	do{
		while(pNode != NULL)
		{
			snode.pNode = pNode;
			snode.tag = L;
			nodes.push(snode);
			pNode = pNode->m_pLeft;
		}
		
		while(!nodes.empty() && nodes.top().tag == R)
		{
			snode = nodes.top();
			nodes.pop();
			
			visit(snode.pNode);
		}
		
		if(!nodes.empty())
		{
			nodes.top().tag = R;
			pNode = nodes.top().pNode->m_pRight;
		}
	
	}while(!nodes.empty());
}

//[3].Basic Operations
int BiTree::CalculateTreeNodes(BiTreeNode* pRoot)
{
	int nodeSum = 0;
	nodeSum = CalculateTreeNodesCore(pRoot);
	
	return nodeSum;
}

int CalculateTreeNodesCore(BiTreeNode* pRoot)
{
	if(NULL == pRoot)
	{
		return 0;
	}
	
	int left = CalculateTreeNodesCore(pRoot->m_pLeft);
	int right = CalculateTreeNodesCore(pRoot->m_pRight);
	
	return left + right + 1;
}

int BiTree::BiTreeDepth(BiTreeNode* pRoot)
{
	if(pRoot == NULL)
		return 0;
	// if(pRoot->m_pLeft == NULL && pRoot->m_pRight == NULL)
		// return 1;
	int left = BiTreeDepth(pRoot->m_pLeft);
	int right = BiTreeDepth(pRoot->m_pRight);
	
	return 1 + (left > right) ? left: right;
}

标题基于SpringBoot+Vue的社区便民服务平台研究AI更换标题第1章引言介绍社区便民服务平台的研究背景、意义,以及基于SpringBoot+Vue技术的研究现状和创新点。1.1研究背景与意义分析社区便民服务的重要性,以及SpringBoot+Vue技术在平台建设中的优势。1.2国内外研究现状概述国内外在社区便民服务平台方面的发展现状。1.3研究方法与创新点阐述本文采用的研究方法和在SpringBoot+Vue技术应用上的创新之处。第2章相关理论介绍SpringBoot和Vue的相关理论基础,以及它们在社区便民服务平台中的应用。2.1SpringBoot技术概述解释SpringBoot的基本概念、特点及其在便民服务平台中的应用价值。2.2Vue技术概述阐述Vue的核心思想、技术特性及其在前端界面开发中的优势。2.3SpringBoot与Vue的整合应用探讨SpringBoot与Vue如何有效整合,以提升社区便民服务平台的性能。第3章平台需求分析与设计分析社区便民服务平台的需求,并基于SpringBoot+Vue技术进行平台设计。3.1需求分析明确平台需满足的功能需求和性能需求。3.2架构设计设计平台的整体架构,包括前后端分离、模块化设计等思想。3.3数据库设计根据平台需求设计合理的数据库结构,包括数据表、字段等。第4章平台实现与关键技术详细阐述基于SpringBoot+Vue的社区便民服务平台的实现过程及关键技术。4.1后端服务实现使用SpringBoot实现后端服务,包括用户管理、服务管理等核心功能。4.2前端界面实现采用Vue技术实现前端界面,提供友好的用户交互体验。4.3前后端交互技术探讨前后端数据交互的方式,如RESTful API、WebSocket等。第5章平台测试与优化对实现的社区便民服务平台进行全面测试,并针对问题进行优化。5.1测试环境与工具介绍测试
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值