二叉樹的非遞迴先序 中序 後序遍歷

2021-08-09 15:45:05 字數 858 閱讀 5214

演算法思想:

先序:nlr的訪問順序,由於r節點,即右孩子的訪問需要通過根節點的指標來實現,所以,需要設乙個棧來儲存根節點。具體看**:

void preorder(btree t)

else

}//while

}

中序遍歷和先序遍歷幾乎一樣:

void midorder(btree t)

else

}}

後序遍歷:lrn順序。l和r都需要通過n的左右指標來指向,所以l和r未訪問完之前,n都要放在棧內。具體為,從l返回時,n不能退棧,從r返回或r為空時,n退棧並訪問。而要判斷是從l返回還是後者,需要用乙個指標r記錄最近訪問的節點來判斷是從l還是r返回。

void postorder(btree t)

else

else//else

}//else

}//while

}

後序遍歷的應用:找祖先,棧頂元素以下的元素全部為其祖先。具體為,把visit部分改為:依次輸出棧內元素。

若找x、y的共同祖先,假設x在y的左邊,則必然先遍歷到x,此時先把棧內元素複製到另乙個輔助棧(x的祖先),繼續遍歷到y時,依次退棧並和輔助棧中的元素比較,若遇到相等的則為共同祖先。

btree conancestor(btree t,btnode *x,btnode *y)

else

else//if(p==y)

r=p;

p=null;

}//else

}//else

}//while

}

二叉樹的非遞迴遍歷(先序,中序,後序)

遍歷演算法 1 中序遍歷的遞迴演算法定義 若二叉樹非空,則依次執行如下操作 1 遍歷左子樹 2 訪問根結點 3 遍歷右子樹。2 先序遍歷的遞迴演算法定義 若二叉樹非空,則依次執行如下操作 1 訪問根結點 2 遍歷左子樹 3 遍歷右子樹。3 後序遍歷得遞迴演算法定義 若二叉樹非空,則依次執行如下操作 ...

二叉樹的非遞迴先序,中序,後序遍歷

二叉樹的非遞迴遍歷 先序遍歷,中序遍歷,後序遍歷 include include using namespace std typedef struct node binode,bitree 先序遞迴建立樹,這裡注意引數的型別,t的型別是 如果是 稍加改動就ok.void createtree bit...

二叉樹非遞迴實現先序 中序 後序遍歷

測試資料 abc000de0f00g00 這是乙個先序序列 0表示當前結點為空 include includetypedef struct node node char chin 100 陣列從儲存獲取的二叉樹序列元素 int m int initchain node q,int step if q...