()略 () 根據中序和後序序列建立二叉樹的遞歸算法見上面第題非遞歸算法見第題
[題目分析]采用後序非遞歸遍歷二叉樹棧中保留從根結點到當前結點的路徑上的所有結點
void PrintPath(BiTree btp) //打印從根結點bt到結點p之間路徑上的所有結點
{BiTree q=bts[]; //s是元素為二叉樹結點指針的棧容量足夠大
int top=; tag[];//tag是數組元素值為或訪問左右子樹的標志tag和s同步
if (q==p) {printf(q>data); return;} //根結點就是所找結點
while(q!=null || top>)
{while(q!=null) //左子女入棧並置標記
if(q==p) //找到結點p棧中元素均為結點p 的祖先
{printf(從根結點到p結點的路徑為\n);
for(i=;i<=top;i++) printf(s[i]>data); printf(q>data); return;
}
else {s[++top]=q; tag[top]=; q=q>lchild;} //沿左分支向下
while(top> && tag[top]==)) top//本題不要求輸出遍歷序列這裡只退棧
if (top>) {q=s[top]; q=q>rchild; tag[top]=; } //沿右分支向下
}//while(q!=null || top>)
}//結束算法PrintPath
[] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] [] []
From:http://tw.wingwit.com/Article/program/sjjg/201311/23714.html