線索二叉樹
1)意義
二叉樹的特點使得許多體現具有樹結構的資料均可以轉換成二叉樹來儲存資料;
n個節點的二叉樹含有n+1個空鏈域;
二叉樹中可以能容易的知道某個節點的孩子節點,但是不易知遍歷的前驅節點和後繼節點;
為了充分的利用二叉樹的特點以及二叉樹中剩餘的空鏈域,提出了一種線索二叉樹。
2)分類
根據二叉樹遍歷的方法不同:可以分為前序線索二叉樹、中序線索二叉樹、後序線索二叉樹
3)線索二叉樹操作
a)資料結構
typedef struct btnodebthnode;
ltag==0 表示lchild指向節點的左孩子節點; ltag==1 表示lchild指向節點的前驅節點;
rtag==0 表示rchild指向節點的右孩子節點;rtag==1 表示rchild指向節點的後繼節點;
b)建立線索二叉樹
銷毀線索二叉樹
輸出某種遍歷序列
輸出某個節點
輸出某個節點的前驅節點
輸出某個節點的後繼結點
c)實現
btnode*create(btnode*bt,btnode*&pre);
void create_(btnode*&p,btnode*&pre);
void destroybt(btnode*&bt);
void destroybt_(btnode*&p);
btnode* getdata(btnode*bt,int data);
btnode* getfirstnode(btnode*bt);
btnode* getlastnode(btnode*bt);
btnode* getprenode(btnode*p);
btnode* getpostnode(btnode*p);
void display(btnode*bt);
建立線索二叉樹
btnode*create(btnode*bt,btnode*&pre)
else
return head;
}/***********
中序遍歷-中序線索二叉樹
***********/
void create_(btnode*&p,btnode*&pre)
else
p->ltag=0;
if(pre->rchild==null)
else
pre->rtag=0;
pre=p;
create_(p->rchild,pre);}}
銷毀線索二叉樹
void destroybt(btnode*&bt)
void destroybt_(btnode*&p)
輸出某個節點
btnode* getdata(btnode*bt,int data)
return null;
}輸出某個節點的前驅節點
btnode* getprenode(btnode*p)
輸出某個節點的後繼結點
btnode* getpostnode(btnode*p)
輸出第乙個節點
btnode* getfirstnode(btnode*bt)
輸出最後的節點
btnode* getlastnode(btnode*bt)
輸出中序序列
void display(btnode*bt)
}
線索二叉樹
當用二叉鍊錶作為二叉樹的儲存結構時,因為每個結點中只有指向其左 右兒子結點的指標,所以從任一結點出發只能直接找到該結點的左 右兒子。在一般情況下靠它無法直接找到該結點在某種遍歷序下的前驅和後繼結點。如果在每個結點中增加指向其前驅和後繼結點的指標,將降低儲存空間的效率。我們可以證明 在n個結點的二叉鍊...
線索二叉樹
1.線索二叉樹結構和操作定義 threadbintree.h 功能 線索標誌域所有值 typedef enumnodeflag 功能 線索二叉樹結構體 typedef struct threadtreethreadbintree 前驅節點指標 threadbintree previous null ...
線索二叉樹
原始碼 中序線索二叉樹 author 菜鳥 version 2014.7.23 include include include typedef char datatype using namespace std 定義線索二叉樹的結構體 typedef struct nodethreadbitreen...