為什麼要對二叉樹進行線索化?
對二叉樹進行遍歷是以一定的規則將二叉樹的節點排列成乙個線性序列,這些線性序列有且僅有乙個直接前驅和直接後繼,但是以二叉鍊錶進行儲存的時候,只能找到節點的左右孩子資訊,不能直接得到節點在任一串行的前驅和後繼資訊,前驅和後繼資訊只能在遍歷的動態過程中才能得到。如何獲取到前驅和後繼的資訊呢?
在有n個節點的二叉鍊錶中必定存在n+1個空鏈域,利用這些空鏈域存放節點的前驅和後繼資訊,所以在每個節點上增加兩個指標域分別指向節點在任一串行中的前驅和後繼資訊。節點結構:
以上述節點結構構成的二叉鍊錶作為二叉鍊錶的儲存結構,叫做線索化煉表;
指向節點前驅和後繼的指標稱為線索;
加上線索的二叉樹稱為線索二叉樹;
對二叉樹以某種次序遍歷使其成為線索二叉樹的過程稱為線索化。
前序線索化:
//prev需要傳引用進去,才能記錄下上次訪問的節點,否則節點的右子樹的線索化不能完成
void _prevorder_th(node* root, node*& prev)
if (root->_leftnode ==
null)
if (prev&&prev->_rightnode ==
null)
prev = root;
if (root->lefttag ==
link)
if (root->righttag ==
link)
}
前序線索化的遍歷:
遇到先對其進行進行訪問,再對其左子樹進行遍歷訪問,直到找到最左的那個節點;再根據線索化的指向對其右子樹進行遍歷訪問。
void preorder()
cout << cur->_data<<
" ";
cur = cur->_rightnode;
}cout << endl;
}
中序線索化:
void _inorder_th(node* root, node*& prev)
else
if (prev&&prev->_rightnode ==
null)
prev = root;
_inorder_th(root->_rightnode, prev);}}
中序線索化的遍歷:
void inorder()
cout << cur->_data <<
" ";
while (cur->righttag ==
thread)
cur = cur->_rightnode;
}
cout << endl;
}
線索化二叉樹 前中後序線索化及前序中序遍歷
pragma once includeusing namespace std enum pointinfo 儲存節點線索資訊 templatestruct binarytreenodethd templateclass binarytreethd binarytreethd t arr,size t...
二叉樹線索化以及線索化前序 中序 後序遍歷
二叉樹線索化以及線索化前序 中序 後序遍歷 前面已經對二叉樹的建立與建立有了一定了解,那二叉樹的線索化又是什麼呢?二叉樹雖然是非線性結構,但二叉樹的遍歷卻為二叉樹的節點匯出了乙個線性序列。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼...
線索二叉樹原理及前序 中序線索化(Java版)
class node title 二叉樹相關操作 description author uncle ming date 2017年1月6日 下午2 49 14 version v1.0 public class threadbinarytree 通過陣列構造乙個二叉樹 完全二叉樹 param arr...