雙電阻差分電流取樣_差分放大電路的應用
阿新 • • 發佈:2022-05-10
樹
樹形結構是一類重要的非線性結構。樹形結構是節點之間有分支,並具有層次關係的結構。
特殊且重要:樹中的節點,只有一個直接的前驅,有n個直接的後繼。
比如:家譜
一、樹的定義
樹(tree)是包含n(n>0)個結點的有窮集。樹中每個元素用結點來表示。
樹的遞迴定義刻畫了樹的固有特性:一棵非空樹是由若干棵子樹構成的,而子樹又可由若干棵更小的子 樹構成。
樹也可以理解:是由根結點和若干棵子樹構成。
二、樹形結構基本術語
1、節點的度:一個節點含有的子樹的個數稱為該節點的度。
2、樹的度:一棵樹中,最大的節點的度稱為樹的度。
3、葉節點(終端節點):度為0的節點。
4、分支節點(非終端節點):度不為0的節點。
5、孩子和雙親:樹中某個節點的子樹之根稱為該節點的孩子或兒子,相應地,該節點稱為孩子的雙親或 父親。同一個雙親的孩子稱為兄弟。
6、祖先和子孫:以某節點為根的子樹中任一節點都稱為該節點的子孫。相反,這個子孫節點沿父節點往 上直至根節點的任一節點稱為祖先。
7、節點的層:從根開始定義起,根為第1層,根的子節點為第2層,以此類推。 8、樹的高度或深度:樹中節點的最大層次。
9、森林:由m(m>=0)棵互不相交的樹的集合稱為森林。
10、有序樹和無序樹:樹中任意節點的子結點之間有順序關係,這種樹稱為有序樹。反之樹中任意節點 的子結點之間沒有順序關係,這種樹稱為無序樹,也稱為自由樹
三、樹形結構的邏輯特徵
1、樹中任意一節點都可以有零個或多個直接後繼(即孩子)節點,但至多隻能有一個直接前趨(即雙 親)節點。
2、樹中只有根節點無前趨,它是開始節點;葉節點無後繼,它們是終端節點。
3、祖先與子孫的關係是對父子關係的延拓,它定義了樹中節點之間的縱向次序。
4、有序樹中,同一組兄弟節點從左到右有長幼之分。
四、樹形結構的程式碼示例
模板類
template<class T> class CMyTree_List { struct TreeNode //私有結構,在類外不需要訪問 { T data; //資料域 TreeNode* parent; //父節點指標 TreeNode* brother; //兄弟節點指標 TreeNode* child; //子節點指標 }; TreeNode* pRoot; //根節點指標 public: CMyTree_List(); ~CMyTree_List(); void clear(); //僅僅是一個介面,清除 bool find(T const& findData) const; //僅僅是一個介面,查詢 void insert(T const& insertData, T const& findData,bool isChild = true); //插入節點:引數1:要插入節點;引數2:插入位置;引數3:預設為插入孩子 private: void _clear(TreeNode* root); //真正用來做刪除的遞迴函式 TreeNode* _find(TreeNode* root, T const& findData) const { if (root) { if (root->data == findData) return root; TreeNode* tempNode = _find(root->brother,findData); if (tempNode) return tempNode; return _find(root->child, findData); } return nullptr; } }; template<class T> void CMyTree_List<T>::insert(T const& insertData, T const& findData, bool isChild) { TreeNode* temp = new TreeNode; temp->data = insertData; temp->parent = nullptr; temp->brother = nullptr; temp->child = nullptr; //準備好了一個可以插入到樹中的新結點 if (pRoot) { TreeNode* findNode = _find(pRoot, findData); if (findNode) { //表示找到了插入結點的位置 if (isChild) { //在該位置的子節點處插入 if (findNode->child) {//存在子節點 TreeNode* tempNode = findNode->child; while (tempNode->brother)//看子節點的兄弟節點存不存在 { tempNode = tempNode->brother;//找到最後一個兄弟節點 } tempNode->brother = temp;//插入新節點 temp->parent = tempNode->parent; } else {//該位置子節點不存在 findNode->child = temp; temp->parent = findNode; } } else { //在該位置的兄弟結點處插入(有序) while (findNode->brother) { findNode = findNode->brother;//找最後一個兄弟 } findNode->brother = temp;//插入新結點成為新的兄弟 temp->parent = findNode->parent;//兄弟的父親成為新節點的父親 } } else { //表示在樹中沒有找到插入的位置 //自定義規則 delete temp; return; } } else { pRoot = temp;//空樹做插入 } } template<class T> bool CMyTree_List<T>::find(T const& findData) const { return _find(pRoot, findData) != nullptr; } template<class T> void CMyTree_List<T>::_clear(TreeNode* root) { if (root) { _clear(root->brother); _clear(root->child); delete root; root = nullptr; } } template<class T> void CMyTree_List<T>::clear() { _clear(pRoot); } template<class T> CMyTree_List<T>::~CMyTree_List() { clear(); } template<class T> CMyTree_List<T>::CMyTree_List() { pRoot = nullptr; } int main() { CMyTree_List<int> cm; cm.insert(2, 1); cm.insert(3, 1); cm.insert(4, 1); cm.insert(5, 2); cm.insert(6, 5, false); system("pause"); return 0; }
插入的樹為: