詳解 前 中 後序線索化二叉樹及其遍歷

2021-07-30 08:04:25 字數 3563 閱讀 5537

前序線索化二叉樹是在二叉樹前序遍歷的過程中對其進行線索化,將葉子節點和單分支節點的指標域線索化成其前驅和後繼,利用遞迴的特點,並且定義兩個節點指標,乙個在前乙個在後,在中序遍歷的過程中通過這兩個前後指標建立前驅後繼的連線關係。

實現**:

//前序線索化二叉樹

void prethbinarytree(btthnode*root, btthnode *&p)

if (p !=

null

&&p->rightchild ==

null)

p = root;

if (root->ltag != thead)//如果不判斷就會造成死迴圈,造成棧溢位

prethbinarytree(root->leftchid, p);

if (root->rtag!=thead)//同理,因為在程式一開始就對其左右孩子為null時就做了前驅後繼的處理,

//但是改了標誌位,所以此處可根據標誌位判斷是子樹還是前驅後繼

prethbinarytree(root->rightchild, p);

}

遍歷**:

btthnode*next_pre(btthnode*p)

void preoderthbinarytree(btthnode*p)//遍歷前序線索化二叉樹

cout << endl;

}

中序線索化二叉樹跟前序線索化二叉樹很相似,在中序遍歷的過程中對葉子結點和單分支節點的指標域線索化為前驅和後繼,實現**如下:

**:

//中序線索化二叉樹

void inthtree(btthnode*root,btthnode *&p)

if (p !=

null

&&p->rightchild ==

null)

p = root;

inthtree(root->rightchild,p);

}

線索化後的二叉樹對其進行遍歷的過程就不需要使用遞迴或者棧的使用,直接根據前驅後繼遍歷,節省了空間,**實現如下:

遍歷過程:

btthnode* first(btthnode *p)

return p;

}btthnode* next(btthnode *p)

//遍歷中序線索化二叉樹

void inoderthtree(btthnode*p)

cout << endl;

}

後序線索化二叉樹在後序遍歷的過程中對其進行線索化,這裡不贅述:

**:

//後序線索化二叉樹

void pastthbinarytree(btthnode*root, btthnode *&p)

if (p !=

null

&&p->rightchild ==

null)

p = root;

}

遍歷的過程:

btthnode* first_past(btthnode*p)//找第乙個前驅

btthnode*

parent(btthnode*p, btthnode*child)//找孩子的雙親

btthnode*next_past(btthnode*p, btthnode*s)//找下乙個後繼

}void pastoderthbinarytree(btthnode*p)//遍歷後序線索化二叉樹

cout << endl;

}

總的源**:

#include

using namespace std;

typedef char elemtype;

typedef enum tagtype;

typedef struct _btthnode

btthnode, *btthtree;

btthnode *buythnode()

memset(p, 0, sizeof(btthnode));

return p;

}btthnode * createthbinarytree(char *&str)

//中序線索化二叉樹

void inthtree(btthnode*root,btthnode *&p)

if (p !=

null

&&p->rightchild ==

null)

p = root;

inthtree(root->rightchild,p);

}btthnode* first(btthnode *p)

return p;

}btthnode* next(btthnode *p)

//遍歷中序線索化二叉樹

void inoderthtree(btthnode*p)

cout << endl;

}//前序線索化二叉樹

void prethbinarytree(btthnode*root, btthnode *&p)

if (p !=

null

&&p->rightchild ==

null)

p = root;

if (root->ltag != thead)//如果不判斷就會造成死迴圈,造成棧溢位

prethbinarytree(root->leftchid, p);

if (root->rtag!=thead)//同理,因為在程式一開始就對其左右孩子為null時就做了前驅後繼的處理,

//但是改了標誌位,所以此處可根據標誌位判斷是子樹還是前驅後繼

prethbinarytree(root->rightchild, p);

}btthnode*next_pre(btthnode*p)

void preoderthbinarytree(btthnode*p)//遍歷前序線索化二叉樹

cout << endl;

}//後序線索化二叉樹

void pastthbinarytree(btthnode*root, btthnode *&p)

if (p !=

null

&&p->rightchild ==

null)

p = root;

}btthnode* first_past(btthnode*p)//找第乙個前驅

btthnode*

parent(btthnode*p, btthnode*child)//找孩子的雙親

btthnode*next_past(btthnode*p, btthnode*s)//找下乙個後繼

}void pastoderthbinarytree(btthnode*p)//遍歷後序線索化二叉樹

cout << endl;

}

C 後序線索化二叉樹及其遍歷

void postthread 後序線索化 後序線索化的遍歷 void postsort if cur cur righttag thread 當cur無右孩子時,cur就可以被訪問了 if cur root cur right null 當根節點被訪問時,遍歷完成 cur cur right 當c...

二叉樹的線索化以及 線索化的先序,中序,後序遍歷

先簡要說下什麼線索化 二叉樹是一種非線性結構,遍歷二叉樹幾乎都是通過遞迴或者用棧輔助實現非遞迴的遍歷。用二叉樹作為儲存結構時,取到乙個節點,只能獲取節點的左孩子和右孩子,不能直接得到節點的任一遍歷序列的前驅或者後繼。由於有n個結點的二叉鍊錶中必定存在n 1個空指標域,因此充分利用這些空指標域來存放結...

前序 中序和後序線索化二叉樹及其遍歷

線索化 二叉樹的左子節點指向的是 前驅節點 右子節點指向的是 後繼節點 二叉樹的線索化有三種 前序 中序和後序線索化,見下圖 下面是實現前序 中序和後序線索化的 實現 實現 定義node節點類 class heronode 構建二叉樹 定義threadedbinarytree 實現了線索化功能的二叉...