感覺上在樹的遍歷型別中,屬後根序遍歷的非遞迴實現最不好寫。
下面演算法取自:http://topic.csdn.net/t/20021018/17/1107596.html
typedef struct mark;
} pmtype; //有mark域的結點指標型別
void postorder_stack(bitree t)//後續遍歷二叉樹的非遞迴演算法,用棧
); //根結點入棧
while(!stackempty(s))
); //修改mark域
if(a.ptr->lchild) push(s,); //訪問左子樹
break;
case 1:
push(s,); //修改mark域case 2:if(a.ptr->rchild) push(s,); //訪問右子樹
break;
visit(a.ptr); //訪問結點,返回}
}//while
}//postorder_stack
分析:為了區分兩次過棧的不同處理方式,在堆疊中增加乙個mark域,mark=0表示剛剛訪問此結點,mark=1表示左子樹處理結束返回,mark=2表示右子樹處理結束返回.每次根據棧頂元素的mark域值決定做何種動作.
樹的前中後序遍歷
include include typedef int datatype typedef struct bnode btree t 建立二叉樹 結點 btree t create bnode datatype data bzero tree,sizeof btree t tree data data...
樹的非遞迴後序遍歷
樹的後序遍歷特點 左 右 根 思路1 先序特點 逆序輸出 先序遍歷特點 根 左 右 在先序非遞迴遍歷 的基礎上可以實現 根 右 左 如果逆序輸出,就是 左 根 右 於是我們需要乙個另外的棧用來逆序輸出。template class t void binarytree postorder 後序遍歷 s...
樹的遍歷 先序遍歷 中序遍歷 後序遍歷
名詞解釋 1 每個元素稱為節點 2 有乙個特定的節點被稱為根節點或樹根 3 除根節點外的其餘資料元素被分為m個互不相交的集合t1,t2,t3.tm 1,其中每乙個集合ti本身也是乙個樹,被稱作原樹的子樹 節點的度 乙個節點含有子樹的個數稱為該節點的度 葉節點或終端節點 度為0的節點稱為葉節點 非終端...