資料結構 實驗報告11

2021-10-06 12:38:23 字數 2934 閱讀 9533

目的:熟悉後序線索二叉樹並實現後序遍歷

要求:(1)建立二叉樹。

(2)轉換為後序線索二叉樹。

(3)實現後序遍歷的非遞迴演算法。

編譯器:vscode +devc++

系統:windows10

cpu:[email protected]

(1)建立二叉樹。

(2)轉換為後序線索二叉樹。

(3)實現後序遍歷的非遞迴演算法。

1.建立二叉樹

沿用之前使用二叉樹建立模板;(若相容後序線索二叉樹的話)

或者重新建立二叉樹類(後序線索二叉樹需要其他輔助變數)

2.轉換成後序線索二叉樹

在轉換時只需要按照後序遍歷,(需要記錄當前結點的前驅)逐個將空指標利用起來

3.實現後序遍歷的非遞迴演算法

需要經過多重迴圈,首先通過while找到最左結點,然後遍歷後繼……

必是選擇鏈式結構;

在建立樹時,使用擴充套件先序序列建立;

詳細設計

第一嘗試:

首先將之前寫的二叉樹類擴充套件了,新增了rtag和ltag變數用於識別指標是否指向兒子;其次新增了乙個全域性結點指標變數,用於實現對前驅的記錄

接著對後序遍歷進行修改

然後就是新增函式  使其能夠進行對後序非遞迴遍歷

在編寫此方面**時就出現了問題

我的第一版函式是如下操作的

1.先找到第乙個結點(最左的結點)

2.再遍歷其後繼

3.然後再找到當前結點的最左兒子

4.重複2,3操作直到結點為空

在實際面對下面二叉樹時,就出現了預想不到的事情:

進入了死迴圈————cdbcdb

下面展示後序線索(綠色指向前驅,紅色指向後繼):

不難看出再程式尋到b時對a的

故而 新增輔助空間:父親指標;

並在建立樹時,記錄每個結點的父親結點

在執行非遞迴後序遍歷時,操作如下

找尋到以當前結點為根的樹的後序遍歷的起始節點

按次序找尋後繼並輸出資料

逐層向上返回,並輸出資料,直到是從當前左子樹返回為止

去訪問右孩子

回到第一步

正確實現了二叉樹向後序線索樹的轉換

並實現了後序遍歷的非遞迴輸出

熟悉了線索二叉樹

資料結構-線索二叉樹(後序線索二叉樹及遍歷)

《大話資料結構》

/*

* @descripttion: 

* @version: 

* @author: nice_try

* @date: 2020-05-26 09:10:57

* @lasteditors: nice_try

* @lastedittime: 2020-05-26 17:59:12

*/#include #include#include#includeusing namespace std;

#define link 0   //表示該節點有非空孩子節點

#define thread 1 //表示該節點有後續節點(對於右子樹來說)

#define maxsize 100

template struct bt_thread_node

;template class thread_binary_tree

;template int thread_binary_tree::create_thread_btree(bt_thread_node*&tree, bt_thread_node*parent_node)

return 1;

}template void thread_binary_tree::postorder_thread_op(bt_thread_node*&tree)

if (pre_node != null && pre_node->right_child == null)

pre_node = tree;

}template void thread_binary_tree::_postorder_op(bt_thread_node*&tree)

while (cur_node != null && cur_node->rtag == thread) //按線索找到次樹節點

if (cur_node == tree) //如果當前節點為根節點,說明遍歷完成

while (cur_node != null && cur_node->right_child == pre_node) //當前節點的右孩子節點剛好上次遍歷,說明該袖珍樹只差根就遍歷完成

if (cur_node != null && cur_node->rtag == link) //回到上一層後,先訪問右孩子

}}template thread_binary_tree::thread_binary_tree() : pre_node(null), top(-1)

template thread_binary_tree::~thread_binary_tree()

}template void thread_binary_tree::postorder_thread()

template void thread_binary_tree::_postorder()

資料結構實驗報告 資料結構實驗報告

使用c語言中的陣列,實現線性表中的順序結構儲存的查詢 刪除操作。1 初始線性表通過陣列 迴圈 scanf語句實現輸入任意個整數。2 刪除操作的實現,任意輸入乙個要刪除的整數,找到這個元素,將此元素之後的所有元素逐個前移一位,實現刪除操作。3 要求以上2步操作可以重複執行。4 例如 刪除操作執行結果大...

資料結構實驗報告

1 掌握佇列儲存結構的表示和實現方法。2 掌握佇列的入隊和出隊等基本操作的演算法實現。3 了解佇列在解決實際問題中的簡單應用。1 建立順序迴圈佇列,並在順序迴圈佇列上實現入隊 出隊基本操作 驗證性內容 2 建立迴圈鏈佇列,並在迴圈鏈佇列上實現入隊 出隊基本操作 設計性內容 3 實現鍵盤輸入迴圈緩衝區...

資料結構實驗報告

1 理解二叉樹的型別定義與性質。2 掌握二叉樹的二叉鍊錶儲存結構的表示和實現方法。3 掌握二叉樹遍歷操作的演算法實現。4 熟悉二叉樹遍歷操作的應用。1 建立二叉樹的二叉鍊錶儲存結構。2 實現二叉樹的先序 中序和後序三種遍歷操作 驗證性內容 3 應用二叉樹的遍歷操作來實現判斷兩棵二叉樹是否相等的操作 ...