線索二叉樹

2021-06-16 11:20:02 字數 3387 閱讀 5882

1. 線索二叉樹結構和操作定義

threadbintree.h

//功能:線索標誌域所有值

typedef enumnodeflag;

//功能:線索二叉樹結構體

typedef struct threadtreethreadbintree;

//前驅節點指標

threadbintree *previous=null;

/*---------------------線索二叉樹所有操作原型宣告 start ------------------------*/

//功能:初始化二叉樹

threadbintree *bintreeinit();

//功能:新增節點到二叉樹

void addnode(threadbintree *bt);

int bintreeaddnode(threadbintree *bt, threadbintree *node, int n);

//功能:二叉樹線索化

//1)先序線索化

//2)中序線索化

void bintreethreading_ldr(threadbintree *bt);

//3)後序線索化

//功能:求指定節點的後繼

threadbintree *bintreenext_ldr(threadbintree *bt);

//功能:求指定節點的前驅

threadbintree *bintreeprevious_ldr(threadbintree *bt);

//功能:遍歷線索二叉樹(根據後繼指標)

void threadbintree_ldr(threadbintree *bt, void (*oper)(threadbintree *p));

//功能:查詢指定資料的節點

threadbintree *bintreefind(threadbintree *bt, data data);

/*---------------------線索二叉樹所有操作原型宣告 end --------------------------*/

/*---------------------線索二叉樹所有操作具體實現 start ------------------------*/

//功能:初始化二叉樹

threadbintree *bintreeinit()

return null;

}//功能:新增節點到二叉樹

void addnode(threadbintree *bt)

dowhile(select!=1 && select!=2);

} return ;

}int bintreeaddnode(threadbintree *bt, threadbintree *node, int n)

switch(n)

else

bt->left = node;

break;

case 2: //新增到右節點

if(bt->right)

else

bt->right = node;

break;

default:

printf("引數錯誤!");

return 0;

} return 1;

}//功能:二叉樹中查詢資料

threadbintree *bintreefind(threadbintree *bt, data data) }}

//功能:二叉樹線索化

//1)先序線索化

//2)中序線索化

void bintreethreading_ldr(threadbintree *bt)

previous = bt;

bintreethreading_ldr(bt->right);

} }//3)後序線索化

//功能:求指定節點的後繼

threadbintree *bintreenext_ldr(threadbintree *bt)

if(bt->rflag == thread) //節點bt的右子樹為空

return bt->right;

else

}//功能:求指定節點的前驅

threadbintree *bintreeprevious_ldr(threadbintree *bt)

if(bt->lflag == thread)

return bt->left;

else

}//功能:遍歷線索二叉樹(根據後繼指標)

void threadbintree_ldr(threadbintree *bt, void (*oper)(threadbintree *p))while(bt);

} return;

}//功能:線索二叉樹中查詢資料(注意不能用二叉樹查詢函式代替)

threadbintree *bintreesearch(threadbintree *bt, data data)

return tmp;

}/*---------------------線索二叉樹所有操作具體實現 start ------------------------*/

2.2.線索二叉樹操作測試

threadbintreetest.cpp

#include#includetypedef char data;

#include"threadbintree.h"

//功能:操作二叉樹的函式

void oper(threadbintree *tmp)

int main()

else

printf("要查詢的節點%c不存在,請重新輸入!\n", node->data);

break;

case 5:

printf("請輸入要查詢的節點資料:");

fflush(stdin);

scanf("%c", &data);

node = bintreesearch(root, data);

if(node)

else

printf("要查詢的節點%c不存在,請重新輸入!\n", node->data);

break;

case 6:

//printf("請輸入從哪個節點開始遍歷:");

//fflush(stdin);

//scanf("%c", &data);

//node = bintreesearch(root, data);

threadbintree_ldr(root, oper);

break;

} }while(select != 0);

system("pause");

return 1;

}

線索二叉樹

當用二叉鍊錶作為二叉樹的儲存結構時,因為每個結點中只有指向其左 右兒子結點的指標,所以從任一結點出發只能直接找到該結點的左 右兒子。在一般情況下靠它無法直接找到該結點在某種遍歷序下的前驅和後繼結點。如果在每個結點中增加指向其前驅和後繼結點的指標,將降低儲存空間的效率。我們可以證明 在n個結點的二叉鍊...

線索二叉樹

原始碼 中序線索二叉樹 author 菜鳥 version 2014.7.23 include include include typedef char datatype using namespace std 定義線索二叉樹的結構體 typedef struct nodethreadbitreen...

線索二叉樹

今天,我們一起用c 實現一顆線索二叉樹,具體 如下 threadinorderiterator.h具體內容如下 cpp view plain copy include threadtree.h template typename type class threadinorderiterator th...