0線索二叉樹的儲存結構體:
1先序序列化:
先序構樹思想:
對於先序線索二叉樹,我想提醒的是:每次只會把當前節點的左子樹前驅鏈上,
這一次的 後繼 不會在本次鏈上,當pcur指向下乙個節點的時候,
才會把上一次的後繼鏈上
**:先序線索化:
先序遍歷的思想:
先往左遍歷一遍,到底了之後往後繼節點或者右子樹找(要先判斷是右子樹還是線索節點)
#include
using
namespace std;
struct node};
typedef node * tree;
tree pre=
new node;
void
create
(tree & root)
if(c==
'\n'
)return
; root=
new node;
//這一步一定不要漏了!!!
root-
>data=c;
create
(root-
>left)
;create
(root-
>right);}
//構建先序線索樹
void
preorderthreading
(tree & node)
if(pre!=
null
&&!pre-
>right)
pre=node;
if(node-
>left&&node-
>ltag==0)
preorderthreading
(node-
>left);if
(node-
>right&&node-
>rtag==0)
preorderthreading
(node-
>right);}
//這一次的 後繼 不會在本次鏈上,當pcur指向下乙個節點的時候,
//才會把上一次的後繼鏈上
//遍歷先序線索樹
void
preorder
(tree node)
cout<
>data<<
" ";
//還沒有把最後乙個輸出
if(temp-
>rtag==
1)temp=temp-
>right;
//跳到後繼節點上
while
(temp!=
null)}
}int
main()
2中序線索化:
中序構樹思想:
和先序差不多,所以先理解好先序,在看中序:
遍歷:
先找到最左邊的,然後找右子樹或者後繼線索節點
#include
using
namespace std;
struct node};
typedef node * tree;
tree pre=
new node;
void
create
(tree & root)
if(c==
'\n'
)return
; root=
new node;
//這一步一定不要漏了!!!
root-
>data=c;
create
(root-
>left)
;create
(root-
>right);}
void
inorderthreading
(tree node)
if(pre&&pre-
>right==
null
) pre=node;
inorderthreading
(node-
>right);}
//首先按照中序遍歷的順序,找到二叉樹的最左邊的節點,
//判斷是否有前驅,有則遍歷訪問,沒有則看右子樹和後繼的情況。
void
inorder
(tree node)
cout<
>data<<
" ";
while
(root&&root-
>rtag==1)
root=root-
>right;
//沒有後繼了,說明有右子樹 }}
intmain()
3後序線索化: 二叉樹線索化及其遍歷方法
include include include include typedef char datatype typedef enum pointflag typedef struct bintreenode node,pnode void initbintree pnode proot pnode ...
樹 二叉樹 線索二叉樹
一 線索二叉樹 1 什麼是線索化 將二叉樹以某種次序將其遍歷,得到線性序列,就是將非線性結構進行線索化。線索化的優點就是可以很快地得到前驅或後繼。如果儲存線索化的線性序列 儲存二叉樹地線索化序列的其中一種方法就是在結點上加兩個指標,乙個指向前驅乙個指向後繼,這樣的缺點就是儲存密度大大降低。另一種方法...
樹與二叉樹 線索二叉樹
若結點有左子樹,則其lchild域指向其左子樹,否則令lchild域指向其前驅 若結點有右子樹,則其rchild域指向其右子樹,否則令rchild域指向其後繼 為了避免混淆,需要改變結點結構,增加兩個標誌域,ltag,rtag,結構如下圖所示 0 lchild域指向其左子樹 1 lchild域指向其...