二叉樹的線索化

2021-07-12 03:36:22 字數 1783 閱讀 7459

線索化意義:

二叉樹是非線性結構,遍歷二叉樹都是通過遞迴或者用棧輔助非遞迴來遍歷的。如果我們知道乙個節點的前驅和後繼,那麼我們就可直接遍歷二叉樹

設定二叉樹節點的前驅和後繼,就是線索化二叉樹,我們利用指向左右子樹的空指標存放節點的前驅和後繼

線索化設計思路:

遍歷二叉樹,當遍歷到乙個節點的左節點或右節點為空時,設定它的前驅和後繼,那麼訪問時直接可根據節點的前驅和後繼來進行訪問

**:

#pragma once

#include#includeusing namespace std;

enum pointertag;

templatestruct binarytreenode_thd

t _data;

binarytreenode_thd* _left;//左孩子

binarytreenode_thd* _right;//右孩子

pointertag _lefttag;//左孩子線索化標誌

pointertag _righttag;//右孩子線索化標誌

};templateclass binarytreethd

void inordertheading()//中序線索化

void inorderthd()//中序遍歷

cout << cur->_data << " ";

while (cur->_righttag == thread)

cur = cur->_right;

} cout << endl;

} void prevordertheading()//前序線索化

void prevorderthd()//前序遍歷

cout << cur->_data << " ";

cur = cur->_right;

} }void postordertheading()//後序線索化

protected:

node* _creattree(const t *a, size_t size, size_t &index, const t& invalid)//建立二叉樹

return node;

} void _inordertheading(node *cur, node* &prev)//遞迴方法中序線索化

if (prev && prev->_right == null)//線索化後繼,這裡由於本次線索化時並不知道其後繼是**,

//因此後繼通過線索化下各節點的前驅時進行線索化

prev = cur;

_inordertheading(cur->_right, prev);

} void _prevordertheading(node *cur, node* &prev)//遞迴方法前序線索化

if (prev && prev->_right == null)

prev = cur;

if (cur->_lefttag==link)

_prevordertheading(cur->_left, prev);

if (cur->_righttag==link)

_prevordertheading(cur->_right, prev);

} void _postordertheading(node *cur, node* &prev)//遞迴方法中序線索化

if (prev && prev->_right == null)

prev = cur;

}private:

node* _root;

};

(C )二叉樹的線索化 線索二叉樹

線索化標誌tag enum pointertag 結點結構 template struct binarytreenodethd 基類迭代器 template struct binarytreeiterator t operator t operator bool operator const sel...

線索化二叉樹以及遍歷線索化二叉樹

1.線索二叉樹基本介紹 n個結點的二叉鍊錶中含有n 1 公式 2n n 1 n 1 個空指標域。利用二叉鍊錶中的空指標域,存放指向該結點在某種遍歷次序下的前驅和後繼結點的指標 這種附加的指標稱為 線索 這種加上了線索的二叉鍊錶稱為線索鍊錶,相應的二叉樹稱為線索二叉樹 threaded binaryt...

線索化二叉樹

define crt secure no warnings 1 includeusing namespace std enum pointertag 列舉 其結構如下 void prevorderthreading 前序 void postorderthreading 後序 void inorder...