JavaScript數據結構11——線索二叉樹的遍歷

線索二叉樹包括了

  • 將一個二叉樹轉為線索二叉樹
  • 建立一個頭結點,形成循環雙向鏈表
  • 遍歷二叉樹
//線索二叉樹
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]

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容