目錄
** **解釋
反思
void bst_postordernr(bst *bst)
lrnode *snode = peek(as);
if (snode->right == null || pre == snode->right)
else
} printf("\n");
release_array_stack(as);
}
//二分搜尋樹的非遞迴後序遍歷
void bst_postordernr(bst *bst)
lrnode *snode = peek(as);//用於輸出或用於指定下乙個入棧元素
if (snode->right == null || pre == snode->right)
else
}printf("\n");
release_array_stack(as);
}
為什麼可以在不符合輸出條件時指定下乙個入棧元素,而不能在符合輸出條件裡指定下乙個入棧元素?
因為需要指定下乙個入棧元素的情況是要輸出右節點的時候。只有父母節點的右節點沒輸出時才需要指定下乙個入棧元素。而葉子節點和右節點已輸出的父母節點都在棧中,通過lrnode *snode = peek(as),即可得到。
如果在注釋處指定入棧元素的話,永遠不會輸出父母節點。父母節點只能為輸出右節點而被訪問。右節點輸出後,不停地讓後面棧頂元素把自己再一次壓入棧。只有沒能輸出的父母節點可以指定下次入棧的元素,其他時候不需要指定。因為除了右節點,其他元素都已入棧。
一次迴圈只能完成 入棧和出棧 或 入棧和指定下次入棧元素 這兩種模式的其中乙個。每次的指定是指向右節點的。如果在注釋處指定,僅適用於葉子節點輸出的情況。不適用於父母節點符合輸出的情況。因為父母節點符合輸出時,pre == snode->right,而為什麼又要指定下次的入棧元素是自己的右節點呢?
樹的非遞迴後序遍歷
樹的後序遍歷特點 左 右 根 思路1 先序特點 逆序輸出 先序遍歷特點 根 左 右 在先序非遞迴遍歷 的基礎上可以實現 根 右 左 如果逆序輸出,就是 左 根 右 於是我們需要乙個另外的棧用來逆序輸出。template class t void binarytree postorder 後序遍歷 s...
遞迴非遞迴實現二分搜尋
二分搜尋方法,充分利用了元素間的次序關係,採用分治策略。可在最壞情況下用時間o logn 時間完成搜尋。includeint binarysearch recur int br,int x,int left,int right else else if x br middle else return...
二分搜尋樹的遍歷
對於一棵二叉樹來說,如果我們想要把這棵樹中的所有節點都給遍歷一遍,那麼我們就需要了解二叉樹的遍歷方式。二叉樹的遍歷方式分為以下三種 二叉樹的乙個簡單的結構如下圖所示 對於其中的 前 中 後 我們都可以理解為是根節點的訪問順序。遍歷時,我們分為三個階段 前 中 後 對於前序遍歷來說 也就是在前階段訪問...