線索鍊錶
線索:將二叉鍊錶中的空指標域指向前驅結點和後繼結點的指標被稱為線索;
線索化:使二叉鍊錶中結點的空鏈域存放其前驅或後繼資訊的過程稱為線索化;
線索二叉樹:加上線索的二叉樹稱為線索二叉樹。
結點結構
;線索二叉樹二叉樹的遍歷方式有4種,故有4種意義下的前驅和後繼,相應的有4種線索二叉樹:⑴ 前序線索二叉樹⑵ 中序線索二叉樹
⑶ 後序線索二叉樹
⑷ 層序線索二叉樹
中序線索鍊錶類的宣告
template class inthrbitree;
中序線索鍊錶的建立——建構函式分析:建立線索鍊錶,實質上就是將二叉鍊錶中的空指標改為指向前驅或後繼的線索,而前驅或後繼的資訊只有在遍歷該二叉樹時才能得到。
template thrnode* inthrbitree::creat( )
return root;
}
建立帶有標誌位的二叉鏈樹
template thrnode* inthrbitree::creat( )
return root;
}
中序線索化二叉樹:遞迴實現基本思想:在遍歷的過程中完成線索化可以採用前序、中序、後序遍歷建立前序線索二叉樹、中序線索二叉樹和後序線索二叉樹。
中序線索二叉樹的構造方法
中序線索化根結點的左子樹;
對根結點進行線索化;
中序線索化根結點的右子樹;
演算法分析
函式設定形參root和全域性變數pre,分別表示要處理的樹的根結點和其前驅結點
如果root!=null
中序線索化root的左子樹
中序線索化root本身
如果root->lchild==null
root->left=pre,root->ltag=1;
如果root->rchild==null,root->rtag=1,
如果pre!=null,並且pre->rtag=1,
pre->rchild=root,;
pre=root
中序線索化root的右子樹
template void thrbitree::thrbitree (thrnode*root)
if (!root->rchild) root->rtag = thread;
if(pre != null)
pre = root;
thrbitree(root->rchild);
}
線索二叉樹的建立
thrnode* pre = null
template inthrbitree::inthrbitree( )
線索鍊錶的遍歷演算法:中序遍歷中序線索樹從中序序列中的第乙個結點出發,進行遍歷?如何確定中序序列的第乙個節點?依次找前乙個節點的後繼
?如何確節點的後繼?
查詢第乙個節點
先從穿線樹的根出發,一直沿左指標,找到「最左」(它一定是中序的第乙個結點);
結點後繼的確定
乙個結點的右指標如果是線索,則右指標就是下乙個要遍歷的結點,
如果右指標不是線索,則它的中序後繼是其右子樹的「最左」結點
遍歷何時停止?
乙個節點的右指標==null
在中序線索樹中查詢結點的中序遍歷的後繼
結點後繼的確定
乙個結點的右指標如果是線索,則右指標就是下乙個要遍歷的結點,
如果右指標不是線索,則它的中序後繼是其右子樹的「最左」結點
template thrnode* inthrbitree::next(thrnode* p)
}return q;
}
線索鍊錶的遍歷演算法:中序遍歷中序線索樹
template void inthrbitree::inorder(thrnode*root)
cout
while (p->rchild!=null)
cout<
}
線索二叉樹 資料結構
按照教材進行中序二叉樹線索化 線索化就是就將二叉樹的多出來的n 1個鏈域用做指向前驅和後繼用,前驅後繼指的是按中序遍歷二叉樹產生的前驅和後繼 ltag 0 有左孩子 ltag 1 無左孩子,指向前驅 rtag 0 有右孩子 rtag 1 無右孩子,指向後繼 例子 構造二叉樹 形如abc de fg ...
資料結構(線索二叉樹)
線索二叉樹的前序,中序,後序 typedef struct nodenode 前序線索二叉樹 參照中序即可 void prethread node p,node pre if pre null pre rchild null pre p if p ltag 0 prethread p lchild,...
資料結構 線索二叉樹
1.定義 在二叉樹的結點上加上線索的二叉樹稱為線索二叉樹,對二叉樹以某種遍歷方式 前序 中序 後序或層序 進行遍歷,使其變為線索二叉樹的過程稱為對二叉樹進行線索化。2.本質 二叉樹的遍歷實質上是對乙個非線性結構進行線性化的過程,它使得每個結點 除第乙個和最後乙個 在這些線性序列中有且僅有乙個直接前驅...