国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

數據結構之二叉樹

2019-11-08 02:27:16
字體:
來源:轉載
供稿:網友

數據結構之二叉樹

標簽(空格分隔): 學習筆記


一、 二叉樹綜述

樹形結構是一類重要的非線性數據結構,其中以樹和二叉樹最為常用。 二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作“左子樹”(left subtree)和“右子樹”(right subtree)。二叉樹常被用作二叉查找樹和二叉堆或是二叉排序樹。二叉樹的每個結點至多只有二棵子樹(不存在度大于2的結點),二叉樹的子樹有左右之分,次序不能顛倒。二叉樹的第i層至多有2的 i -1次方個結點;深度為k的二叉樹至多有2k?1個結點;對任何一棵二叉樹T,如果其終端結點數(即葉子結點數)為n0,度為2的結點數為n2,則n0 = n2 + 1。 二叉樹的鏈式存儲結構是一類重要的數據結構,其形式定義如下:

struct TreeNode{ int val; TreeNode *left, *right;};

二、二叉樹的建立

采用遞歸的方法前序(根左右)建立二叉樹,以#符號表示此當前數值為空。

TreeNode* CreateBiTree(){ char ch; TreeNode* T; scanf_s("%c", &ch); if (ch == '#') { T = NULL; } else { T = (TreeNode*)malloc(sizeof(TreeNode)); T->val = ch; T->left = CreateBiTree(); T->right = CreateBiTree(); } return T;//返回根節點}

測試圖像: 微信截圖_20160822110832.png-33.3kB 測試結果: 微信截圖_20160822111005.png-16.3kB

三、二叉樹的遍歷

序是根據樹根的遍歷位置來說的,前序就是先遍歷根,后遍歷左右子節點 比如這樣的樹 A / / B C 根是A,前序遍歷就是ABC,中序就是BAC,后序就是BCA,根據A的位置決定

3.1 前序遍歷

void PReOrderTraverse(TreeNode* T){ if (T) { printf("%c", T->val); PreOrderTraverse(T->left); PreOrderTraverse(T->right); }}

3.2 中序遍歷

//中序遍歷二叉樹void MidOrderTraverse(TreeNode* T){ if (T) { MidOrderTraverse(T->left); printf("%c->", T->val); MidOrderTraverse(T->right); }}

3.3 后序遍歷

//后序遍歷二叉樹void BackOrderTraverse(TreeNode* T){ if (T) { BackOrderTraverse(T->left); BackOrderTraverse(T->right); printf("%c->", T->val); }}

3.4二叉樹的層次遍歷

采用層次遍歷的方式遞歸遍歷二叉樹的所有元素;

void levelTraverse(TreeNode* T) { vector<TreeNode*> vec; vec.push_back(T); int cur = 0; int end = 1; while (cur < vec.size()) { end = vec.size(); while (cur < end) { cout << vec[cur]->data << " "; if (vec[cur]->lchild) vec.push_back(vec[cur]->lchild); if (vec[cur]->rchild) vec.push_back(vec[cur]->rchild); cur++; } cout << endl; } }

運行結果如下圖所示: 微信截圖_20160822114201.png-5.1kB

四、二叉樹的最大深度

給定一個二叉樹,其最大深度指的是根節點到所有葉子節點中的最大距離。同樣采用遞歸的方式遍歷二叉樹,沒遍歷一次,計數器+1;

int maxDepth(TreeNode *root) { // write your code here if(root == NULL) { return 0; } int max_left=1; int max_right=1; if(root->left != NULL) { max_left = maxDepth(root->left) + 1; } if(root->right != NULL) { max_right = maxDepth(root->right) + 1; } return max_left>max_right?max_left:max_right; }
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 双柏县| 墨脱县| 洞头县| 南阳市| 广饶县| 阿鲁科尔沁旗| 卢湾区| 宁乡县| 黔东| 涟水县| 榆中县| 承德县| 池州市| 思南县| 岚皋县| 怀集县| 利津县| 竹北市| 昌黎县| 大方县| 武胜县| 辰溪县| 蕉岭县| 旬阳县| 响水县| 鄱阳县| 金山区| 泰顺县| 普宁市| 盈江县| 双桥区| 吉首市| 通州市| 壶关县| 沿河| 五河县| 文化| 安吉县| 揭阳市| 修文县| 临桂县|