採用遞迴線索化二叉樹非常的方便簡單,與三序(先、中、後)遍歷二叉樹的演算法頗為相似。只是在遍歷二叉樹的過程中,如果有節點的左子樹為空那麼將左標記改為線索,左孩子指標指向前驅(若是第乙個節點就置為空),如果節點右子樹為空那麼將右標記改為線索,右孩子指標指向其後繼(若為遍歷的最後乙個節點那麼指向另設的頭節點)。
遞迴演算法的思路以及實現在大多數情況下比非遞迴更直接、容易理解(自己的理解)。所以非遞迴演算法就需要有乙個函式每次返回遍歷過程中的乙個結點指標(遍歷演算法可以借鑑我之前發的部落格,傳送門:二叉樹遞迴-非遞迴三序遍歷),在記錄下前乙個指標pre的前提下根據返回節點的子樹情況線索化二叉樹。
下面貼出線索化的**(非遞迴版的,emm,,只寫了中序線索化的非遞迴版,因為沒有含量。而遞迴呢也算是對思維的考察),廢話不多說,看**:
#include
#include
using
namespace std;
//-----------------------二叉樹的二叉線索儲存結構------------------------//
typedef
enum
ptrtype;
typedef
struct btree btree,
*pbtree;
//-----------------------中序-非遞迴的二叉樹線索化------------------------//
intmidorderthreading
(pbtree &root, pbtree &head)
//成功返回0,失敗返回-1 if(
!p->lchild)
} pre = p;
}while
(p);
//遍歷完成返回空指標
pre-
>rchild = head;
pre-
>rtag = thread;
head-
>rchild = pre;
//頭節點左指標指向二叉樹根節點,右指標指向中序最後乙個節點
}return0;
//線索化完成
}//-----------------------中序-遞迴版二叉樹線索化------------------------//
pbtree pre =
nullptr
;//全域性前驅指標,方便一點
void
midthreading
(pbtree p)
;int
_midorderthreading
(pbtree &root, pbtree &head)
return0;
//線序化成功
}void
midthreading
(pbtree p)
//中序遞迴部分
if(pre &&
!pre-
>rchild)
pre = p;
midthreading
(p->rchild);}
}//-----------------------先序-遞迴的二叉樹線索化------------------------//
void
prethreading
(pbtree)
;int
preorderthreading
(pbtree &root, pbtree &head)
return0;
}void
prethreading
(pbtree p)
//先序遞迴部分
if(pre &&
!pre-
>rchild)
pre = p;
prethreading
(p->lchild)
;prethreading
(p->rchild);}
}//-----------------------後序-遞迴的二叉樹線索化------------------------//
void
behthreading
(pbtree)
;int
behorderthreading
(pbtree root, pbtree head)
}void
behthreading
(pbtree p)
//遞迴部分
if(pre &&
!pre-
>rchild)
pre = p;
//最終指向根節點 }}
intmain()
(前幾天過年回家了,進度耽擱了抱歉!疫情這麼嚴重我就不該東走西走哈哈哈)
資料結構 線索二叉樹的線索化(中序 先序 後序)
線索二叉樹 include include typedef struct threadnodethreadnode,threadtree threadnode pre null 定義全域性變數pre,指向當前訪問結點的前驅 threadtree createthreadtree threadtree...
資料結構 線索二叉樹 先序
4.4 尋找先序後繼 4.5 先序遍歷 4.6 main函式 4.7 測試 5.小結 include include define elemtype char 線索二叉樹結點型別定義 typedef struct threadnode threadnode,threadtree 函式宣告 void ...
二叉樹的線索化以及 線索化的先序,中序,後序遍歷
先簡要說下什麼線索化 二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。由於有n個結點的二叉鍊錶中必定存在n 1個空指標域,因此充分利用這些空指標域來存放結...