1.訪問完b的左子樹後,回到b,此時不能訪問b
2.訪問完b的右子樹後,回到b,此時訪問b,訪問完b之後,將b歸空,只要b被訪問,說明它的左右子樹已經訪問結束,不需要再用了。如果沒有右子樹,直接訪問b。
那麼,如何判斷上面兩種情況?
第一:每個節點添加isfirst標記,初始化爲true,表示第一次出現在棧頂,也就是第一種情況,此時需要獲取右子,而不是訪問。
第二:添加一個指針指向上一個訪問的節點。如果右子等於上一個訪問的節點,或者右子爲空,那麼直接訪問b,否則,右子入棧。
關於後序遍歷棧的一個結論:
訪問:d
棧:a,b,d
訪問:g
棧:a b e g
訪問:e
棧:a,b
結論:訪問某個節點時,棧中的所有元素恰好是該節點的所有祖先(算法實現:https://blog.csdn.net/qq_39328436/article/details/106788087)。從棧底到棧頂剛好是根節點到該節點的路徑
利用這個性質可以求路徑,也可以求最近祖先節點
關於先序和中序遍歷棧的一個結論:
由於先序算法中,是先訪問該節點再入棧
中序算法中是,出棧該節點,再訪問。
所以先序對應入棧序列,中序對應出棧序列