主要是利用二叉樹的空指標域,若為空,使左指標指向前驅,並標記ltag為1;使右指標指向後驅,並標記rtag為1;
要注意的是構造結束後,此時pre指向最後乙個結點,此時需記得pre->right = nullptr, pre->rtag = 1。否則這棵樹的右子樹無法遍歷;
這樣使得這些指標域不至於浪費,並能夠加快查詢結點前驅和後繼的速度。
#include #include using namespace std;
typedef int elementtype;
typedef struct treenode
}*threadtree;
void visit(treenode* node)
void inorder(threadtree root)
}threadtree bst_insert(threadtree root, int n = 0)
threadtree p = root, pre;
while( p )
if( x < pre->val ) pre->left = t;
else pre->right = t;
} return root;
}// 構造中序線索二叉樹,注意引數是引用
void inthread(threadtree& p, threadtree& pre)
if( pre && !pre->right )
pre = p; //當前結點轉為前驅
inthread(p->right, pre); //右子樹線索化
}
} bool createinthread(threadtree root)
return false;
}// 中序遍歷第乙個節點,是最左下的結點(不一定是葉節點)
treenode* firstnode(threadtree p)
// 後繼結點,若無直接後繼,則返回線索後繼
treenode* nextnode(threadtree p)
void thread_inorder(threadtree root)
//7//6 2 8 1 4 7 3
int main( )
return 0;
}
中序線索二叉樹
就是在中序遍歷的時候加上線索,為了區分線索和孩子,要多加兩個標誌變數ltag,rtag如果標誌為true就表明是線索,如果為false就表示孩子 一般規定是將做指標為空的指標域用來存放直接前驅 將有指標為空的指標域用來存放直接後繼 當然如果不為空的話就不會用來存放前後繼,而是孩子了 意思就是存放前繼...
二叉樹中序線索
我先說一說 每個 節點 那 五個格 的資料 的含義中間拿乙個是儲存資料的。從左向右 第乙個 和 第五個 是指標,具體指向什麼 取決於第二個 和 第四個的值 第二個 如果是零,實線表示,則 第乙個指向的是 左孩子 第二個 如果是1,虛線表示,則 第乙個 指向的是 在中序遍歷次序下 該節點的前驅 即前乙...
中序線索二叉樹
對於一顆有n個節點的二叉樹,每個節點有2個指標域,共2n個指標域,使用n 1個指標域,二叉線索樹便是將剩下的n 1個指標域也利用起來。在普通二叉樹中,我們僅知道乙個節點的左右孩子,並不知道它的直接前驅節點和直接後驅節點,若能知道它的前驅節點和後去節,便可以將這個資料結構進行遍歷,可極大的提高效率。二...