對於一棵二叉樹來說,如果我們想要把這棵樹中的所有節點都給遍歷一遍,那麼我們就需要了解二叉樹的遍歷方式。
二叉樹的遍歷方式分為以下三種:
二叉樹的乙個簡單的結構如下圖所示:
對於其中的「前」。「中」,「後」,我們都可以理解為是根節點的訪問順序。
遍歷時,我們分為三個階段:前 中 後
對於前序遍歷來說:也就是在前階段訪問根節點,中階段訪問左節點,後階段訪問右節點。(即根->左->右)
對於中序遍歷來說:在中階段訪問根節點,前階段訪問左節點,後階段訪問右節點。(即左->中->右)
對於後序遍歷來說:在後階段訪問根節點,前階段訪問左節點,中階段訪問右節點。(即左->右->根)
以下是相應的遍歷**:
前序遍歷:
//以前序遍歷來遍歷以root為根節點的二叉樹
void preorder(node*node)
}
中序遍歷:
//中序遍歷以node為根的二叉樹
void inorder(node*node)
}
後序遍歷:
//以後序遍歷的方式遍歷以root為根的二叉樹
void postorder(node*node)
}
對於需要遍歷乙個二叉樹做一定的事情的時候,我們用前序遍歷就夠了,但是中序遍歷和後序遍歷也有他們存在的意義。
因為中序遍歷的定義,先訪問左子樹,後根,然後訪問右子樹,而二叉樹的結構特點為根左邊的左子樹一定小於根,根右邊的右子樹一定大於根。因此我們按照中序遍歷的出來的順序剛好是從小排到大的。
對於後序遍歷來說,因為後序遍歷是最後訪問根的,而對於二叉樹的釋放來說,首先得釋放根的左右子樹,然後在釋放根(如果先釋放根,則丟失了root->left和root->right的資訊,則不能知道左右子樹的位址,從而無法正常的釋放完全),這剛好符合了後序遍歷的特點。因此,可以用後序遍歷來釋放二叉樹。
下面是二叉樹的析構函式實現方法(利用了後序遍歷)
//刪除以node為根的二叉樹
void deletetree(node*node)
}
以下是我們的測試資料:
bsta=bst();
cout<
下面是輸出的結果:
0the tree is empty
3 2 1 9
1 2 3 9
1 2 9 3
二分搜尋樹的遍歷
遍歷 訪問二分搜尋樹的每乙個元素。深度優先遍歷 每乙個,節點訪問三次。第一次訪問節點的時候最數進行操作。public void preorder 前序遍歷以node為根的二分搜尋樹,遞迴 private void preorder node node public string tostring 生...
二分搜尋樹 中序遍歷
二分搜尋樹的中序遍歷結果是順序的 package tree 具有可比性的泛型 public class bstcomparable private node root private int size public bst public intsize public boolean isempty ...
5 5 二分搜尋樹的遍歷(深度優先遍歷)
首先嘗試走到最深。遍歷方式 對遍歷方式解釋 前序遍歷 先訪問當前節點,再依次遞迴訪問左右子樹。中序遍歷 先遞迴訪問左子樹,再訪問自身 再遞迴訪問右子樹。後序遍歷 先遞迴訪問左右子樹,再訪問自身節點。釋放整個二叉樹的時候會使用到後序遍歷。把握要點 訪問當前節點的順序是在前面 中間還是在後面。其實,的實...