二叉樹線索化實現

2021-07-23 13:46:00 字數 3286 閱讀 2289

二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只 能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。

為了儲存這種在遍歷中需要的資訊,我們利用二叉樹中指向左右子樹的空指標來存放節點的前驅和後繼資訊。

enum pointertag ;

template

struct binarytreenode_thd

;int array[15] = ;

建立二叉樹

}前序線索化

void _prevorderthreading(node*cur,node*& prev)//線索化遍歷//可迴圈,遇到乙個節點找前驅或後繼

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

prev = cur;

if(cur->_lefttag == link)

if(cur->_righttag == link)

}

前序遍歷

void _prevoverthd(node*cur)

cout<_data>

cur = cur->_right;

} cout<

中序線索化

//上乙個節點

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

}

中序遍歷

void _inorderthd(node*root)

cout<_data>

while(cur->_righttag==thread)

if(cur->_righttag==link)

cur = cur->_right;

} cout<

後序線索化

}詳細**實現

#include#include#includeusing namespace std;

enum tag

;template struct binarytreethnode

};template class binarytree

binarytree(t *a,size_t size,const t&invalid)

void inorderthreading()

void inorderthd()

void prevorderthreading()

void prevoverthd()

void postorderthreading()

void postorderthd()

protected:

node* _createtree(t*a,size_t size,size_t &index,const t& invalid)

return root;

} void _prevorderthreading(node*cur,node*& prev)//線索化遍歷//可迴圈,遇到乙個節點找前驅或後繼

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

prev = cur;

if(cur->_lefttag == link)

if(cur->_righttag == link)

} void _prevoverthd(node*cur)

cout<_data>

cur = cur->_right;

} cout<_left>

//左子樹

if(root->_left==null)

//上乙個節點

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

prev = root;

_inorderthreading(root->_right,prev);

} void _inorderthd(node*root)

cout<_data>

while(cur->_righttag==thread)

if(cur->_righttag==link)

cur = cur->_right;

} cout<_left>

_postorderthreading(root->_right,prev);

if(root->_left==null)

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

prev=root;

} /*???*///void _postorderthd(node*root)//線索化遍歷//可迴圈,遇到乙個節點找前驅或後繼

// // cout<_data>

// cur = cur->_right;

// }

// cout

/*tree.inorderthreading();

tree.inorderthd();*/

/*tree.prevorderthreading();

tree.prevoverthd();*/

/*tree.postorderthreading();

tree.postorderthd();*/

}int main()

二叉樹線索化

二叉樹的線索化可以使得二叉樹的非遞迴遍歷不需借助棧或佇列這種資料結構,最主要的是可以為之提供迭代器。線索化二叉樹有三種方式 前序線索化 中序線索化 後序線索化 後序線索化需要三叉鏈結構 這裡主要講前序線索化和中序線索化,並為中序線索化提供迭代器。線索化的思想就是將一顆二叉樹遍歷轉換成有序雙向鍊錶進行...

二叉樹線索化

名稱 二叉樹線索化 說明 這個東西,一開始弄起來,我去,感覺老複雜了。照著書上看了好久,愣是沒看懂,照著敲了一遍,又手動模擬推了一遍,有了一點思路。照著把後序的線索化和遍歷也敲出來了。這裡要注意的是 對於中序來說,其能線索化後訪問到其前驅和後繼 可以理解為不通過棧訪問到 而對於後序來說,其只能不通過...

二叉樹線索化

public void infixthrnodes treenode node infixthrnodes node.lchild if node.lchild null if pre null pre.rchild null pre node infixthrnodes node.rchild 0...