//本次練習的是 二叉樹線索化的 前·中·後序 《 線索化 》 的遞迴和非遞迴實現
#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...