/*
名稱:二叉樹線索化
說明:這個東西,一開始弄起來,我去,感覺老複雜了。照著書上看了好久,愣是沒看懂,照著敲了一遍,又手動模擬推了一遍,有了一點思路。照著把後序的線索化和遍歷也敲出來了。
這裡要注意的是:對於中序來說,其能線索化後訪問到其前驅和後繼(可以理解為不通過棧訪問到),而對於後序來說,其只能不通過棧訪問到其後繼(這也是我後序遍歷敲的是倒序的原因),要想訪問到其後繼只能通過一般的遞迴或使用棧的方法。同理,先序遍歷也只能訪問到其後繼。
//線索化結點
typedef struct threadnode
threadnode,*threadtree;
//建立二叉樹(未線索化)
void createthreadtree(threadtree &t)
else
}//中序線索化
void inthread(threadtree &p,threadtree &pre) //pre是先序結點,p是當前節點
if(pre !=
null
&& pre->rchild ==
null) //當前結點的右子樹為空
pre = p;
inthread(p->rchild,pre); //遞迴右子樹
}}//遞迴遍歷建立中序線索二叉樹
void createinthread(threadtree t)
}//遞迴輸出中序線索化二叉樹
void threadinorder(threadtree t)
}//求中序線索化後以p為根節點的樹的中序線索化的第乙個結點
//即以p為根節點的樹的最左下角的結點
threadnode* firstnode(threadnode *p)
//求中序線索化後p的後繼節點
threadnode* nextnode(threadnode *p)
}//非遞迴中序遍歷線索二叉樹(不需要用到棧)
void threadinorder1(threadnode *t)
}//後序線索化
void postthread(threadtree &p,threadtree &pre)
if(pre !=
null
&& pre->rchild !=
null) //pre指向上一次遞迴中的結點,即上乙個結點
pre = p;
}}//後序建立線索化二叉樹
void createpostthread(threadtree t)
}//求後序線索化後結點p的前驅結點
threadnode* prenode(threadtree p)
}}//後序遍歷二叉樹(倒序遍歷非遞迴)
void threadpostorder2(threadtree t)
}
二叉樹線索化
二叉樹的線索化可以使得二叉樹的非遞迴遍歷不需借助棧或佇列這種資料結構,最主要的是可以為之提供迭代器。線索化二叉樹有三種方式 前序線索化 中序線索化 後序線索化 後序線索化需要三叉鏈結構 這裡主要講前序線索化和中序線索化,並為中序線索化提供迭代器。線索化的思想就是將一顆二叉樹遍歷轉換成有序雙向鍊錶進行...
二叉樹線索化
public void infixthrnodes treenode node infixthrnodes node.lchild if node.lchild null if pre null pre.rchild null pre node infixthrnodes node.rchild 0...
二叉樹線索化
線索二叉樹 按照某種遍歷方式對二叉樹進行遍歷,可以把二叉樹中所有結點排序為乙個線性序列。在改序列中,除第乙個結點外每個結點有且僅有乙個直接前驅結點 除最後乙個結點外每乙個結點有且僅有乙個 直接後繼結點。這些指向直接前驅結點和指向直接後續結點的指標被稱為線索 thread 加了線索的二叉樹稱為線索二叉...