树形结构是一类重要的非线性结构。树形结构是节点之间有分支,并具有层次关系的结构。
特殊且重要:
树中的节点,只有一个直接的前驱,有n个直接的后继
比如:家谱
树的定义
树(tree)是包含n(n>0)个结点的有穷集。树中每个元素用结点来表示。
在一棵非空树中,有且仅有一个特定的称为根的节点,当n>1时其余节点可分为m(m>0)个互不相交
的有限集T1,T2……Tm,其中,每一个集合本身又是一棵树,并且称为根的子树(subtree)。
树也可以理解:是由根结点和若干颗子树构成。
树的递归定义刻画了树的固有特性:一棵非空树是由若干棵子树构成的,而子树又可由若干棵更小的子
树构成。
树形结构基本术语
1、节点的度:一个节点含有的子树的个数称为该节点的度。
2、树的度:一棵树中,最大的节点的度称为树的度。
3、叶节点(终端节点):度为0的节点。
4、分支节点(非终端节点):度不为0的节点。
5、孩子和双亲:树中某个节点的子树之根称为该节点的孩子或儿子,相应地,该节点称为孩子的双亲或
父亲。同一个双亲的孩子称为兄弟。
6、祖先和子孙:以某节点为根的子树中任一节点都称为该节点的子孙。相反,这个子孙节点沿父节点往
上直至根节点的任一节点称为祖先。
7、节点的层:从根开始定义起,根为第1层,根的子节点为第2层,以此类推。
8、树的高度或深度:树中节点的最大层次。
9、森林:由m(m>=0)棵互不相交的树的集合称为森林。
10、有序树和无序树:树中任意节点的子结点之间有顺序关系,这种树称为有序树。反之树中任意节点
的子结点之间没有顺序关系,这种树称为无序树,也称为自由树。
树形结构的逻辑特征
1、树中任意一节点都可以有零个或多个直接后继(即孩子)节点,但至多只能有一个直接前趋(即双
亲)节点。
2、树中只有根节点无前趋,它是开始节点;叶节点无后继,它们是终端节点。
3、祖先与子孙的关系是对父子关系的延拓,它定义了树中节点之间的纵向次序。
4、有序树中,同一组兄弟节点从左到右有长幼之分。
树形结构的代码示例

#include<iostream>
using namespace std;
int main() {

	return 0;
}
template <typename T>
class CMyTree_list {
	struct TreeNode {
		T data;
		TreeNode* pParent;
		TreeNode* pBrother;
		TreeNode* pChild;
	};
	TreeNode* pRoot;
public:
	CMyTree_list();
	~CMyTree_list();
public:
	void clear();
	bool find(T const& findData);
	void insert(T const& insertData, T const& findData, bool isChild = true);
private:
	void _clear(TreeNode* root);
	TreeNode* _find(TreeNode* root, T const& findData) {
		if (root) {
			if (root->data == findData) {
				return root;
			}
			TreeNode* tempNode = _find(root->pBrother, findData);
			if (tempNode) {
				return tempNode;
			}
			return _find(root->pChild, findData);
		}
		return nullptr;
	}
};
template<typename T>
void CMyTree_list<T>::insert(T const& insertData, T const& findData, bool isChid) {
	TreeNode* tempInsertNode = new TreeNode;
	tempInsertNode->data = insertData;
	tempInsertNode->pParent = nullptr;
	tempInsertNode->pBrother = nullptr;
	if (pRoot) {
		TreeNode* findNode = _find(pRoot, findData);
		if (findData) {
			if (isChild) {
				if (findNode->pchild) {
					TreeNode* tempNode = findData->pChild;
					while (tempNode->pBrother) {
						tempNode = tempNode->pBrother;
					}
					tempNode->pBrother = tempInsertNode;
					tempInsertNode->pParent = tempNode->pParent;
				}
				else {
					findNode->pChild = tempInsertNode;
					tempInsertNode->pParent = findNode;
				}
			}
			else {
				TreeNode* tempNode = pRoot;
				while (tempNode->pChild) {
					tempNode = tempNode->pChild;
				}
				tempNode->pChild = tempInsertNode;
				tempInsertNode->pPaernt = tempNode;
			}
		}
		else {
			pRoot = tempInsertNode;
		}
	}
}
template <typename T>
bool CMyTree_list<T>::find(T const& findData) {
	return _find(pRoot, findData) != nullptr;
}
template <typename T>
void  CMyTree_list<T>::_clear(TreeNode* root) {
	if (root) {
		_clear(root->pBrother);
		_clear(root->pChild);
		delete root;
		root = nullptr;
	}
}
template<typename T>
void  CMyTree_list<T>::clear() {
	_clear(pRoot);
}
template<typename T>
CMyTree_list<T>::CMyTree_list() {
	pRoot = nullptr;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 对于数据结构中的某个元素,前驱指的是比它小的最大元素,后继指的是比它大的最小元素。在二叉搜索中,可以通过中序遍历得到有序序列,从而求得前驱和后继。如果是其他数据结构,可以根据具体情况采用不同的算法实现。 ### 回答2: 数据结构是计算机科学中最基本和重要的概念之一,用于组织和管理数据的方式。在数据结构中,求前驱和后继是常见的操作,用于查找给定元素的前一个和后一个元素。 在线性数据结构中,如数组和链表,求前驱和后继非常简单。对于数组来说,前一个元素可以使用当前元素的索引减1来获得,后一个元素可以使用当前元素的索引加1来获得。对于链表来说,前一个元素可以通过遍历链表找到当前元素的前一个节点,后一个元素则是当前节点的下一个节点。 在形数据结构中,求前驱和后继的方式略有不同。对于二叉来说,前驱是指中序遍历中当前节点的前一个节点,后继是指中序遍历中当前节点的后一个节点。通常可以通过在节点中保存指向父节点的指针,以便在中进行导航和查找前驱、后继节点。 总结来说,求前驱和后继是数据结构中常见的操作之一,具体的实现方法取决于不同的数据结构。对于线性数据结构,可以使用索引或指针来直接定位前一个和后一个元素。对于形数据结构,通常需要借助其他辅助信息或遍历算法来查找前驱和后继。 ### 回答3: 数据结构中有很多不同的数据类型和数据结构,其中一些数据结构支持查找前驱和后继的操作。这些操作通常与有序数据相关,比如数组、链表和二叉搜索。 在数组中,如果元素有一定的顺序,那么我们可以通过索引来找到前一个和后一个元素。例如,在具有n个元素的数组中,第i个元素的前驱是第i-1个元素,后继是第i+1个元素,当然这里要注意边界情况,第一个元素没有前驱,最后一个元素没有后继。 在链表中,每个节点包含一个值和指向下一个节点的指针。我们可以通过遍历链表来找到一个节点的前驱和后继。例如,给定一个链表和一个节点,我们可以从链表头开始遍历,直到找到该节点,然后通过访问前一个节点和后一个节点来获得前驱和后继。 在二叉搜索中,每个节点包含一个值、一个指向左子的指针和一个指向右子的指针。通过比较节点的值,我们可以在二叉搜索中找到一个节点的前驱和后继。前驱是小于该节点值的最大节点,后继是大于该节点值的最小节点。 总结来说,数据结构中求前驱和后继的具体操作方式取决于所使用的数据结构类型。在数组中,可以通过索引操作来找到前一个和后一个元素。在链表中,可以通过遍历链表来找到一个节点的前驱和后继。在二叉搜索中,可以通过比较节点的值来找到一个节点的前驱和后继。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值