線索二叉樹包括了
- 將一個二叉樹轉為線索二叉樹
- 建立一個頭結點,形成循環雙向鏈表
- 遍歷二叉樹
//線索二叉樹
function BiTrNode(data) {
this.data = data;
this.lTag = 1;
this.rTag = 1;
}
BiTrNode.prototype.setlChild = function(tag,node){
this.lTag = tag;
this.lChild = node;
}
BiTrNode.prototype.setRChild = function(tag,node){
this.rTag = tag;
this.rChild = node;
}
var Threading = {
preBiTrTree:null,
start:null,
end:null
}
Threading.inThreadingB = function(biTrTree){
if(biTrTree){
console.info('當前到達節點'+biTrTree.data);
this.inThreadingB(biTrTree.lChild);
if(!biTrTree.lChild){
console.info(biTrTree.data+' 沒有左節點信息')
biTrTree.lTag = 0;//0代表線索,1代表子樹
biTrTree.lChild = this.preBiTrTree;
if(!this.preBiTrTree){
this.start = biTrTree;
}
console.info(biTrTree.data+' 左節點賦為'+
(this.preBiTrTree==null?'空指針':this.preBiTrTree.data));
}
if(this.preBiTrTree&&!this.preBiTrTree.rChild){
console.info(this.preBiTrTree.data+' 沒有右節點信息')
this.preBiTrTree.rTag = 0;
this.preBiTrTree.rChild = biTrTree;
console.info(this.preBiTrTree.data+' 右節點賦為'+
(biTrTree==null?'空指針':biTrTree.data));
}
this.preBiTrTree = biTrTree;
this.end = biTrTree;
this.inThreadingB(biTrTree.rChild);
}
}
//中序遍歷線索化
Threading.inThreadingA = function(biTrTree){
this.inThreadingB(biTrTree);
var T = new BiTrNode(null);
T.setlChild(0,this.start);
T.setRChild(1,this.end);
this.start.lChild = T;
this.end.rChild = T;
return T;
}
//遍歷二叉樹
Threading.inOrderTraverse = function(T){
var p = T.lChild;
while(p!=T){
while(p.lTag ==1){
p = p.lChild;
}
console.info(p.data);
while(p.rTag==0&&p.rChild!=T){
p = p.rChild;
console.info(p.data);
}
p =p.rChild;
}
}
var a = new BiTrNode('a');
var b = new BiTrNode('b');
var c = new BiTrNode('c');
var d = new BiTrNode('d');
var e = new BiTrNode('e');
var f = new BiTrNode('f');
var g = new BiTrNode('g');
var h = new BiTrNode('h');
var i = new BiTrNode('i');
var j = new BiTrNode('j');
a.setlChild(1,b);
a.setRChild(1,c);
b.setlChild(1,d);
b.setRChild(1,e);
d.setlChild(1,h);
d.setRChild(1,i);
e.setlChild(1,j);
c.setlChild(1,f);
c.setRChild(1,g);
var r = Threading.inThreadingA(a);
Threading.inOrderTraverse(r);
控制臺輸出
當前到達節點a
當前到達節點b
當前到達節點d
當前到達節點h
h 沒有左節點信息
h 左節點賦為空指針
h 沒有右節點信息
h 右節點賦為d
當前到達節點i
i 沒有左節點信息
i 左節點賦為d
i 沒有右節點信息
i 右節點賦為b
當前到達節點e
當前到達節點j
j 沒有左節點信息
j 左節點賦為b
j 沒有右節點信息
j 右節點賦為e
e 沒有右節點信息
e 右節點賦為a
當前到達節點c
當前到達節點f
f 沒有左節點信息
f 左節點賦為a
f 沒有右節點信息
f 右節點賦為c
當前到達節點g
g 沒有左節點信息
g 左節點賦為c
hdibjeafcg
[Finished in 0.1s]