1. 程式人生 > 其它 >雙電阻差分電流取樣_差分放大電路的應用

雙電阻差分電流取樣_差分放大電路的應用

樹形結構是一類重要的非線性結構。樹形結構是節點之間有分支,並具有層次關係的結構。

特殊且重要:樹中的節點,只有一個直接的前驅,有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;
}

插入的樹為: