日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第五章学习小结

發布時間:2023/12/31 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第五章学习小结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第五章學習小結

特殊的樹

  • 二叉排序樹(二叉查找樹/二叉搜索樹):若它的左子樹不空,則左子樹上所有結點的值均小于它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大于它的根結點的值; 它的左、右子樹也分別為二叉排序樹
  • 最小堆:是一種經過排序的完全二叉樹,其中任一非終端節點的數據值均不大于其左子節點和右子節點的值
  • 哈夫曼樹(最優二叉樹):給定n個權值作為n個葉子結點,構造一棵二叉樹,該樹的帶權路徑長度達到最小。哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。

    深入虎穴

    實踐課上進行了一道難題的講解,心得如下
    點擊跳轉:深深深深深深入虎穴

    樹的同構

    因為偷懶就把思路寫在注釋里了,所以就直接貼上來

  • /* 主要思路是利用遞歸對兩個樹進行判斷 對于這兩棵樹,有兩個對應子樹是同構的,兩棵樹不一定是同構的 但有兩個對應子樹不是同構的,兩棵樹就一定不是同構的 所以在遞歸過程中,只要出現不同構,就可以退出,判斷不同構的 如果是同構,則繼續遞歸進行比較 需要對以下情況進行判斷: 1. 兩棵樹為空:同構 2. 空樹和非空樹:不同構 3. 兩棵樹根不同:不同構 由于我們先從左子樹判斷,所以先對左結點分析 4. 左結點為空:比較右結點 5. 左結點不為空:當兩棵樹左結點相同時,分別比較兩棵樹的左子樹和右子樹是否相同 以上都是對兩棵樹的結點是否相同進行的判斷,也就判斷兩棵樹各個結點是否相等 還沒有進行是否同構的判斷。要怎么判斷是否同構呢? 同構是左右結點互換形成的,本質上是判斷一棵樹的左結點是否和另一顆樹的右結點是否相等 因此當樹不相同時(不是4、5),要對左右結點進行判斷 */#include <iostream>using namespace std;//結點定義 typedef struct node {char name;char lchild;char rchild; }Tree;int create(Tree tree[], int n); bool isSame(Tree tree1[], Tree tree2[], int root1, int root2);int main() {int m, n, root1, root2;bool result = false;Tree tree1[10], tree2[10];cin >> m;root1 = create(tree1, m);cin >> n;root2 = create(tree2, n);if (m != n) { //結點數目不相等則不同構result = false;}else if (m == 0 && n == 0) { //兩顆空樹為同構result = true;}else if (isSame(tree1, tree2, root1, root2)) {result = true;}if (result) {cout << "Yes";}else {cout << "No";}return 0; }//輸入,同時得到根結點下標 int create(Tree tree[], int n) {int a[10] = { 0 }; //用來記錄作為輸入中作為葉子結點出現的結點從而得到根結點int result = 0;if (n == 0) { //空表,避免野指針tree = NULL;}else { //輸入結點構建樹for (int i = 0; i < n; i++) {cin >> tree[i].name >> tree[i].lchild >> tree[i].rchild;if (tree[i].lchild != '-') {a[tree[i].lchild - '0'] = 1;}if (tree[i].rchild != '-') {a[tree[i].rchild - '0'] = 1;}}//循環得出根結點for (int i = 0; i < n; i++) {if (a[i] == 0) {result = i;break;}}}return result; }bool isSame(Tree tree1[], Tree tree2[], int root1, int root2) {//子樹為空if ( root1 == '-' - '0' && root2 == '-' - '0') { return true;}//空樹和非空樹if ((root1 == '-' - '0' && root2 != '-' - '0') && (root1 != '-' - '0' && root2 == '-' - '0')) {return false;}//根結點不同if (tree1[root1].name != tree2[root2].name) {return false;}//左子樹為空,比較右子樹if (tree1[root1].lchild == '-'&&tree2[root2].lchild == '-') {return isSame(tree1, tree2, tree1[root1].rchild - '0', tree2[root2].rchild - '0');}//左子樹相同if ((tree1[root1].lchild != '-'&&tree2[root2].lchild != '-') && (tree1[tree1[root1].lchild - '0'].name == tree2[tree2[root2].lchild - '0'].name)) {return isSame(tree1, tree2, tree1[root1].lchild - '0', tree2[root2].lchild - '0') && isSame(tree1, tree2, tree1[root1].rchild - '0', tree2[root2].rchild - '0');}else { //比較左右、右左子樹return isSame(tree1, tree2, tree1[root1].lchild - '0', tree2[root2].rchild - '0') && isSame(tree1, tree2, tree1[root1].rchild - '0', tree2[root2].lchild - '0');} }

    心得與目標

    讓我印象最深的還是樹的邏輯結構與存儲結構不必一致。很多情況下可以用數組而非二叉鏈表,會讓程序的實現方便很多。
    比較遺憾的是之前的目標沒有很好地達成,沒有很好地學習stl或者閱讀其源碼,雖然對、和基本的操作都有涉及,但不應該僅僅停留于“我會用”的境地,而應該要知道“為什么這么用”。因此將其擬定為這次目標。相對的,我閱讀了《高質量C++編程指南》,受到了比較大的觸動(前言比正文好看)。我自認為我的編程習慣很好,卻還是有很多不足的地方,令人慚愧。因此對這本書還打算有進一步的閱讀。

    posted on 2019-05-04 16:50 BlackDn 閱讀(...) 評論(...) 編輯 收藏

    轉載于:https://www.cnblogs.com/luoyang0515/p/10808940.html

    總結

    以上是生活随笔為你收集整理的第五章学习小结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。