日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

二叉树——基本概念

發(fā)布時(shí)間:2024/7/23 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二叉树——基本概念 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

二叉樹的概念

??樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),他有n(n>=0)個(gè)有限的結(jié)點(diǎn)組成的一個(gè)有層次關(guān)系的集合。之所以叫樹,是因?yàn)檫@種數(shù)據(jù)結(jié)構(gòu)看起來像是一個(gè)倒掛的樹,根朝上,葉子朝下。特點(diǎn)就是每個(gè)結(jié)點(diǎn)有0個(gè)或多個(gè)結(jié)點(diǎn),沒有父結(jié)點(diǎn)的結(jié)點(diǎn)稱為根結(jié)點(diǎn),并且每一個(gè)非根結(jié)點(diǎn)有且只有一個(gè)父結(jié)點(diǎn)。二叉樹就是其中的一種,二叉樹中的每個(gè)結(jié)點(diǎn)只有兩個(gè)子結(jié)點(diǎn)。

二叉樹在實(shí)際中的優(yōu)勢(shì)

??在實(shí)際使用時(shí)會(huì)根據(jù)鏈表和有序數(shù)組等數(shù)據(jù)結(jié)構(gòu)的不同優(yōu)勢(shì)進(jìn)行選擇。有序數(shù)組的優(yōu)勢(shì)在于二分查找,鏈表的優(yōu)勢(shì)在于數(shù)據(jù)項(xiàng)的插入和數(shù)據(jù)項(xiàng)的刪除。但是在有序數(shù)組中插入數(shù)據(jù)就會(huì)很慢,同樣在鏈表中查找數(shù)據(jù)項(xiàng)效率就很低。綜合以上情況,二叉樹可以利用鏈表和有序數(shù)組的優(yōu)勢(shì),同時(shí)可以合并有序數(shù)組和鏈表的優(yōu)勢(shì),二叉樹也是一種常用的數(shù)據(jù)結(jié)構(gòu)。

樹中的名詞:

結(jié)點(diǎn)的度:一個(gè)節(jié)點(diǎn)含有子樹的個(gè)數(shù)稱為這個(gè)結(jié)點(diǎn)的度。
樹的度:一棵樹中,最大的結(jié)點(diǎn)的度。
節(jié)點(diǎn)的層次:從根開始定義起,根為第1層,根的子節(jié)點(diǎn)為第2層,以此類推。
樹的高度或深度:樹中結(jié)點(diǎn)的最大層次。
兄弟節(jié)點(diǎn):具有相同父節(jié)點(diǎn)的節(jié)點(diǎn)互稱為兄弟節(jié)點(diǎn)。
二叉樹(圖)

特殊的二叉樹
??滿二叉樹:一個(gè)二叉樹,如果每一層的系結(jié)點(diǎn)都達(dá)到了最大值,則這個(gè)二叉樹就是滿二叉樹。如果一個(gè)二叉樹的層數(shù)位K,且結(jié)點(diǎn)總數(shù)是(2^K)-1,這個(gè)二叉樹就是滿二叉樹。
??完全二叉樹:完全二叉樹是效率很高的數(shù)據(jù)結(jié)構(gòu),如果一個(gè)二叉樹的深度為n,除第n層外,其他各層(1~n-1)的節(jié)點(diǎn)數(shù)都達(dá)到最大個(gè)數(shù),第h層所有節(jié)點(diǎn)都連續(xù)集中在最左邊,這個(gè)二叉樹就是完全二叉樹。
二叉樹的性質(zhì):
??若規(guī)定根節(jié)點(diǎn)的層數(shù)為1,則一個(gè)非空二叉樹的第i層上最多有2^(i-1)個(gè)結(jié)點(diǎn)。(i>0)
??若規(guī)定只有根節(jié)點(diǎn)的深度為1,則深度為n的二叉樹的最大結(jié)點(diǎn)數(shù)是(2^n)-1。(k>=0)
??對(duì)于任何一個(gè)二叉樹,如果其葉子結(jié)點(diǎn)個(gè)數(shù)為n0,度為2的非葉子結(jié)點(diǎn)個(gè)數(shù)為n2,則有n0=n2+1。
??具有n個(gè)結(jié)點(diǎn)的完全二叉樹深度k為log2(n+1)向上取整.
??對(duì)于具有n個(gè)結(jié)點(diǎn)的完全二叉樹,如果按照從上至下從左至右的順序?qū)λ薪Y(jié)點(diǎn)從0開始編號(hào),則對(duì)于??序號(hào)為i的結(jié)點(diǎn)有:如果i>0,雙親序號(hào)為(i-1)/2;如果i=0,i為根節(jié)點(diǎn)編號(hào),??沒有父結(jié)點(diǎn);如果2i+1<n,左孩子序列號(hào)為2i+1,否則沒有左孩子;如果2i+2<n,右孩子序列號(hào)為2i+2,否則沒有右孩子。
二叉樹的存儲(chǔ)
鏈?zhǔn)胶晚樞虼鎯?chǔ)(堆)
二叉樹鏈?zhǔn)酱鎯?chǔ)實(shí)現(xiàn)

//創(chuàng)建新結(jié)點(diǎn) BTreeNode* BuyBTreeNode(BTdataType data) {BTreeNode* pNewNode = (BTreeNode*)malloc(sizeof(BTreeNode));if (pNewNode == NULL){assert(0);return NULL;}pNewNode->data = data;pNewNode->left = NULL;pNewNode->right = NULL;return pNewNode; }//創(chuàng)建二叉樹 BTreeNode* _CreatNode(vector<int> arr, size_t* index, BTdataType falg) {BTreeNode* root = NULL;if (*index < arr.size() && arr[*index] != falg){root = BuyBTreeNode(arr[*index]);(*index)++;root->left = _CreatNode(arr, index, falg);(*index)++;root->right = _CreatNode(arr, index, falg);}return root; }BTreeNode* CreatBTree(vector<int> arr, BTdataType falg) {size_t index = 0;return _CreatNode(arr, &index, falg); }//前序遍歷(遞歸) void PreOrde(BTreeNode * root) {if (root != NULL){cout << root->data << " ";PreOrde(root->left);PreOrde(root->right);} } //前序遍歷(非遞歸) void PreOrde1(BTreeNode* root) {//從最右結(jié)點(diǎn)開始?jí)簵?/span>stack<BTreeNode*> buff;BTreeNode* cur = root;while (!buff.empty() || cur != NULL){//向當(dāng)前結(jié)點(diǎn)的左邊一直延伸,直到NULL為止while (cur){cout << cur->data << " ";buff.push(cur);cur = cur->left;}//到這里就說明當(dāng)前結(jié)點(diǎn)為空了//如果棧中有數(shù)據(jù),就說明不是二叉樹的最后一個(gè)結(jié)點(diǎn)//就需要繼續(xù)向后走if (!buff.empty()){BTreeNode* temp = buff.top();buff.pop();cur = temp->right;}} }//中序遍歷(遞歸) void InOrde(BTreeNode * root) {if (root != NULL){InOrde(root->left);cout << root->data << " ";InOrde(root->right);} } //中序遍歷(非遞歸) void InOrde1(BTreeNode* root) {stack<BTreeNode*> buff;BTreeNode* cur = root;while (!buff.empty() || cur != NULL){while (cur){buff.push(cur);cur = cur->left;}if (!buff.empty()){BTreeNode* temp = buff.top();buff.pop();cout << temp->data << " ";cur = temp->right;}} }//后序遍歷 void PostOrde(BTreeNode * root) {if (root != NULL){PostOrde(root->left);PostOrde(root->right);cout << root->data << " ";} } //后序遍歷(非遞歸) void PostOrde1(BTreeNode* root) {stack<BTreeNode*> buff;BTreeNode* cur = root;//使用一個(gè)棧來同步當(dāng)前結(jié)點(diǎn)的右子樹是否已經(jīng)處理完stack<bool> rf;while (!buff.empty() || cur != NULL){while (cur){buff.push(cur);cur = cur->left;//在判斷棧中插入false,說明當(dāng)前結(jié)點(diǎn)還有右子樹沒有遍歷rf.push(false);}if (!buff.empty()){bool temp = rf.top();//如果是false,說明右子樹還沒有處理完//否則可以打印當(dāng)前結(jié)點(diǎn),右子樹已經(jīng)遍歷完了if (temp){cout << buff.top() << " ";buff.pop();rf.pop();}else{rf.pop();rf.push(true);cur = buff.top();}}} }//獲取當(dāng)前結(jié)點(diǎn)的左孩子 BTreeNode* LeftChild(BTreeNode* root) {return root->left; } //獲取當(dāng)前結(jié)點(diǎn)的右孩子 BTreeNode* RightChild(BTreeNode* root) {return root->right; }//銷毀樹 void DestoryBTree(BTreeNode** root) {assert(root);if (*root){DestoryBTree(&(*root)->left);DestoryBTree(&(*root)->right);free((*root));*root = NULL;} }//樹中結(jié)點(diǎn)的個(gè)數(shù) int BTreeSize(BTreeNode* root) {if (root == NULL)return 0;elsereturn BTreeSize(root->left) + BTreeSize(root->right) + 1; }//樹中葉子結(jié)點(diǎn)的個(gè)數(shù) int BTreeLeafSize(BTreeNode* root) {if (root == NULL)return 0;if (root->left == NULL && root->right == NULL)return 1;return BTreeLeafSize(root->left) + BTreeLeafSize(root->right); }//樹的高度 int BTreeHeight(BTreeNode* root) {if (root == NULL)return 0;else{return max(BTreeHeight(root->left), BTreeHeight(root->right)) + 1;} }//在樹中查找 BTreeNode* BTreeFind(BTreeNode* root, BTdataType x) {if (root = NULL)return NULL;else if (root->data == x)return root;BTreeNode* ret = BTreeFind(root->left, x);if (ret != NULL){return ret;}elsereturn BTreeFind(root->right, x);}//樹的層序遍歷 void BinaryTreeLeveOrder(BTreeNode* root) {if (root == NULL)return;queue<BTreeNode*> s;s.push(root);while (!s.empty()){BTreeNode* tmp = s.front();s.pop();cout << tmp->data << " ";if (tmp->left != NULL)s.push(tmp->left);if (tmp->right != NULL)s.push(tmp->right);} }//樹的層數(shù) int BTreeLevelKSize(BTreeNode* root, int k) {if (root == NULL || k <= 0)return 0;if (k == 1)return 1;return BTreeLevelKSize(root, k - 1) + BTreeLevelKSize(root, k - 1); }

總結(jié)

以上是生活随笔為你收集整理的二叉树——基本概念的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。