树
树形结构是一类重要的非线性结构。树形结构是节点之间有分支,并具有层次关系的结构。
特殊且重要:
树中的节点,只有一个直接的前驱,有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;
}