目的:熟悉後序線索二叉樹並實現後序遍歷
要求:(1)建立二叉樹。
(2)轉換為後序線索二叉樹。
(3)實現後序遍歷的非遞迴演算法。
編譯器:vscode +devc++
系統:windows10
(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 應用二叉樹的遍歷操作來實現判斷兩棵二叉樹是否相等的操作 ...