数据结构学习第十五课(无序树)

这篇博客介绍了如何实现一个无序树的数据结构,包括插入、查找、修改和删除节点的操作。模板类`MyTree`使用内部结构体`Node`表示树节点,每个节点包含数据、父节点、兄弟节点和子节点指针。插入节点时,可以指定新节点成为已存在节点的子节点或兄弟节点。同时,提供了查找、修改和删除节点的方法。
摘要由CSDN通过智能技术生成

无序树

#pragma once
#include<string.h>
template <typename T>
class MyTree
{
	//内部类
	struct Node
	{
		T data;//数据
		Node* parent;//指向当前节点的父结点
		Node* brother;//指向当前节点的兄弟节点
		Node* child;//指向当前节点的子节点
	};
	Node* pRoot;//指向根结点
public:
	MyTree();
	~MyTree();
	/*
	插入节点到树中
	insertData:新节点数据
	findData:新节点成为findData节点的子节点或者兄弟节点
	isBrother:为真 新节点成为findData节点的兄弟节点
	为假 新节点成为findData节点的子节点
	*/
	bool insertNode(const T& findData,
		const T& insertData, bool isBrother = true);
	//创建新节点并返回
	Node* createNode(const T& data)
	{
		Node* newNode = new Node;
		memset(newNode, 0, sizeof(Node));
		newNode->data = data;
		return newNode;
	}
	//从树中查找数据为findData的节点,找到返回节点地址
	Node* findNode(const T& findData);
	//修改
	Node* modifyNode(const T& findData, const T& modifyData);
	//删除
	bool deleteNode(const T& deleteData);
private:
	///从root树中查找数据为findData的节
	//找到返回节点地址
	Node* _findNode(Node* root, const T& dindData);
	//删除
	bool _deleteNode(const T& deleteData);
};

template<typename T>
inline MyTree<T>::MyTree()
{
	pRoot = NULL;
}

template<typename T>
inline MyTree<T>::~MyTree()
{

}

template<typename T>
inline bool MyTree<T>::insertNode(const T& findData, const T& insertData, bool isBrother)
{
	//1 创建新节点
	Node* newNode = createNode(insertData);
	//2 如果原本树为空
	if (NULL == pRoot)
	{
		pRoot = newNode;
		return true;
	}
	
	//3 如果原本树不为空
	Node* pInsert = _findNode(pRoot, findData);
	Node* pCurrent;
	if (pInsert)//能找到插入的节点
	{
		if (isBrother)//成为兄弟
		{
			//找到findData节点的最小兄弟
			pCurrent = pInsert;
			while (pCurrent->brother)
			{
				pCurrent = pCurrent->brother;
			}
			//插入
			pCurrent->brother = newNode;
			newNode->parent = pCurrent->parent;
		}
		else//成为孩子
		{
			//找到findData节点的最小孩子
			pCurrent = pInsert;
			while (pCurrent->child)
			{
				pCurrent = pCurrent->child;
			}
			//插入
			pCurrent->child = newNode;
			newNode->parent = pCurrent;
		}
	}
	else//找不到插入的节点
	{
		pCurrent = pRoot;
		if (isBrother)//成为兄弟
		{
			//找到findData节点的最小兄弟
			while (pCurrent->brother)
			{
				pCurrent = pCurrent->brother;
			}
			//插入
			pCurrent->brother = newNode;
			newNode->parent = pCurrent->parent;
		}
		else//成为孩子
		{
			//找到findData节点的最小孩子
			while (pCurrent->child)
			{
				pCurrent = pCurrent->child;
			}
			//插入
			pCurrent->child = newNode;
			newNode->parent = pCurrent;
		}
	}
	return true;
}

template<typename T>
typename MyTree<T>::Node* MyTree<T>::findNode(const T& findData)
{
	return _findNode(pRoot,findData);
}

template<typename T>
typename MyTree<T>::Node* MyTree<T>::modifyNode(const T& findData, const T& modifyData)
{
	Node* modifyNode = _findNode(pRoot, findData);
	if (NULL == modifyNode)
	{
		return NULL;
	}
	modifyNode->data = modifyData;
	return modifyNode;
}



//返回内部类加typename 和类名域
template<typename T>
typename MyTree<T>::Node* MyTree<T>::_findNode(Node* root, const T& findData)
{
	//1防御性编程
	if (NULL == root)
	{
		return NULL;
	}
	//2 循环查找
	Node* pCurrent = root;//当前层
	Node* pTemp = NULL;//当前层的当前节点
	while (pCurrent)
	{
		pTemp = pCurrent;
		while (pTemp)
		{
			if (findData == pTemp->data)
			{
				return pTemp;
			}
			pTemp = pTemp->brother;//往右
		}
		pCurrent = pCurrent->child;//往下
	}

	return NULL;
}

template<typename T>
bool MyTree<T>::_deleteNode(const T& deleteData)
{
	return false;
}
template<typename T>
bool MyTree<T>::deleteNode(const T& deleteData)
{
	//1 找到要删除的节点
	Node* delNode=_findNode(pRoot, deleteData);
	return false;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值