今天來總結下二叉樹前序、中序、後序遍歷相互求法,即如果知道兩個的遍歷,如何求第三種遍歷方法,比較笨的方法是畫出來二叉樹,然後根據各種遍歷不同的特性來求,也可以程式設計求出,下面我們分別說明。例如:求下面樹的三種遍歷首先,我們看看前序、中序、後序遍歷的特性:
前序遍歷:
1.訪問根節點
2.前序遍歷左子樹
3.前序遍歷右子樹
中序遍歷:
1.中序遍歷左子樹
2.訪問根節點
3.中序遍歷右子樹
後序遍歷:
1.後序遍歷左子樹
2.後序遍歷右子樹
3.訪問根節點
一、已知前序、中序遍歷,求後序遍歷
例:前序遍歷: gdafemhz
中序遍歷: adefghmz
畫樹求法:
第一步,根據前序遍歷的特點,我們知道根結點為g
第二步,觀察中序遍歷adefghmz。其中root節點g左側的adef必然是root的左子樹,g右側的hmz必然是root的右子樹。
第三步,觀察左子樹adef,左子樹的中的根節點必然是大樹的root的leftchild。在前序遍歷中,大樹的root的leftchild位於root之後,所以左子樹的根節點為d。
第四步,同樣的道理,root的右子樹節點hmz中的根節點也可以通過前序遍歷求得。在前序遍歷中,一定是先把root和root的所有左子樹節點遍歷完之後才會遍歷右子樹,並且遍歷的左子樹的第乙個節點就是左子樹的根節點。同理,遍歷的右子樹的第乙個節點就是右子樹的根節點。
第五步,觀察發現,上面的過程是遞迴的。先找到當前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了。該步遞迴的過程可以簡潔表達如下:
1 確定根,確定左子樹,確定右子樹。
2 在左子樹中遞迴。
3 在右子樹中遞迴。
4 列印當前根。
那麼,我們可以畫出這個二叉樹的形狀:
那麼,根據後序的遍歷規則,我們可以知道,後序遍歷順序為:aefdhzmg
程式設計求法:(依據上面的思路,寫遞迴程式)
1 #include 2 #include 3 #include 4;treenode* binarytreefromorderings(char* inorder, char* aftorder, int length)5 struct treenode
6 ;11 12 void binarytreefromorderings(char* inorder, char* preorder, int length)
13 19 treenode* node = new treenode;//noice that [new] should be written out.
20 node->elem = *preorder;
21 int rootindex = 0;
22 for(;rootindex < length; rootindex++)
23
27 //left
28 binarytreefromorderings(inorder, preorder +1, rootindex);
29 //right
30 binarytreefromorderings(inorder + rootindex + 1, preorder + rootindex + 1, length - (rootindex + 1));
31 cout
二、已知中序和後序遍歷,求前序遍歷
依然是上面的題,這次我們只給出中序和後序遍歷:
中序遍歷: adefghmz
後序遍歷: aefdhzmg
畫樹求法:
第一步,根據後序遍歷的特點,我們知道後序遍歷最後乙個結點即為根結點,即根結點為g。
第二步,觀察中序遍歷adefghmz。其中root節點g左側的adef必然是root的左子樹,g右側的hmz必然是root的右子樹。
第三步,觀察左子樹adef,左子樹的中的根節點必然是大樹的root的leftchild。在前序遍歷中,大樹的root的leftchild位於root之後,所以左子樹的根節點為d。
第四步,同樣的道理,root的右子樹節點hmz中的根節點也可以通過前序遍歷求得。在前後序遍歷中,一定是先把root和root的所有左子樹節點遍歷完之後才會遍歷右子樹,並且遍歷的左子樹的第乙個節點就是左子樹的根節點。同理,遍歷的右子樹的第乙個節點就是右子樹的根節點。
第五步,觀察發現,上面的過程是遞迴的。先找到當前樹的根節點,然後劃分為左子樹,右子樹,然後進入左子樹重複上面的過程,然後進入右子樹重複上面的過程。最後就可以還原一棵樹了。該步遞迴的過程可以簡潔表達如下:
1 確定根,確定左子樹,確定右子樹。
2 在左子樹中遞迴。
3 在右子樹中遞迴。
4 列印當前根。
這樣,我們就可以畫出二叉樹的形狀,如上圖所示,這裡就不再贅述。
那麼,前序遍歷: gdafemhz
程式設計求法:(並且驗證我們的結果是否正確)
#include #include #include struct treenode
treenode* node = new treenode;//noice that [new] should be written out.
node->elem = *(aftorder+length-1);
std::cout
node->right = binarytreefromorderings(inorder + rootindex + 1, aftorder + rootindex , length - (rootindex + 1));
return node;
}int main(int argc, char** argv)
輸出結果:gdafemhz
遍歷即將樹的所有結點訪問且僅訪問一次。按照根節點位置的不同分為前序遍歷,中序遍歷,後序遍歷。
前序遍歷:根節點->左子樹->右子樹
中序遍歷:左子樹->根節點->右子樹
後序遍歷:左子樹->右子樹->根節點
前序遍歷:abdefgc中序遍歷:debgfac
後序遍歷:edgfbca
二叉樹的遍歷 二叉樹遍歷與儲存
在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...
玩轉二叉樹(二叉樹的遍歷)
時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入格式 ...