二叉樹的線索化

2021-09-20 17:04:15 字數 3823 閱讀 5398

//本次練習的是      二叉樹線索化的    前·中·後序  《 線索化 》  的遞迴和非遞迴實現

#include

using namespace std;

enum type

;template

struct binarytreenode

};template

class binarytreethread

;binarytreethread(const t* arr, size_t size)

//     以下用的是   遞迴

void inorderthread()    //中序線索化

void inorder()   //中序遍歷

void prevorderthread()   //前序線索化

void prevorder()    //前序遍歷

void lastorderthread()   //後序線索化

void lastorder()    //後序遍歷

//以下用的不是遞迴

void inorder_not()   //中序線索化

void prevorder_not()   //前序線索化

void lastorder_not()   //後序線索化

//     以下用的是   遞迴

protected:

binarytreenode* _create(const t* arr, size_t& index, size_t size)

binarytreenode* root = new binarytreenode(arr[index]);

root->_left = _create(arr, ++index, size);

if (root->_left != null)

root->_right = _create(arr, ++index, size);

if (root->_right != null)

return root;

}void _inorderthread(binarytreenode* root,binarytreenode*& prev)  //注意  加  引用

_inorderthread(root->_left,prev);              //遞迴左

if (root != null && root->_left == null)  //左鏈結

if (prev != null && prev->_right == null) //右鏈結

prev = root;

_inorderthread(root->_right,prev);             //遞迴右

}void _inorder(const binarytreenode* root)

if (root->_lefttype == link)

cout << root->_date << "  ";

if (root->_righttype == link)

}void _prevorderthread(binarytreenode* root, binarytreenode*& prev)

if (root != null && root->_left == null)

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

prev = root;

if (root->_lefttype == link)         //這個節點已經線索化 所以要判斷為link  

if (root->_righttype == link)         //這個節點已經線索化  

}void _prevorder(binarytreenode* root)

cout << root->_date<

if (root->_lefttype == link)

if (root->_righttype == link)

}void _lastorderthread(binarytreenode* root, binarytreenode*& prev)

_lastorderthread(root->_left,prev);

_lastorderthread(root->_right,prev);

if (root != null && root->_left == null)

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

prev = root;

}void _lastorder(binarytreenode* root)

if (root->_lefttype == link)

if (root->_righttype == link)

cout << root->_date << "  ";

}//  以下用的不是遞迴

protected:

void _inorder_not(binarytreenode* root)

cout << cur->_date << "  ";

while (cur != null && cur->_righttype == thread)

cur = cur->_right;}}

void _prevorder_not(binarytreenode* root)

while (cur != null && cur->_righttype == thread)

cur = cur->_right;}}

void _lastorder_not(binarytreenode* root)   //關鍵問題:1.判斷乙個節點已遍歷  2.找到下乙個節點

binarytreenode* cur = root->_left;

binarytreenode* prev = null;

while (cur != _root)

if (cur != null && cur->_righttype == thread)

if (cur == _root)   //如果跳到了_root  就表示已經遍歷完成

//此時 右樹已經遍歷完成

if (cur != null && cur->_righttype == link && cur->_right == prev)//如果根節點的右子樹已經遍歷完成  則跳到根節點的父親節點

(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...