二叉樹中的先序遍歷 中序遍歷和後序遍歷關係

2021-07-24 16:44:48 字數 1500 閱讀 9936

先序、中序以及後序遍歷是我們遍歷二叉樹常用方法,當然還有層級遍歷。前三者屬於深度優先遍歷,後者屬於廣度優先遍歷。今天我們談談前面三種遍歷的關係。即,已知先序、中序、後序遍歷中的哪幾種可以確定一棵樹的結構,從而得出另一種或兩種遍歷的結果。

首先假設我們只知道三種遍歷中的一種的結果。顯然只知道一種遍歷結果不能確定一棵樹的結構,先序遍歷和後序遍歷只能找到根節點,不能判斷左右子樹;中序遍歷甚至連根節點都找不到。

那麼假設我們知道三種遍歷中的兩種呢?假如我們知道了先序遍歷和中序遍歷的結果(樹中所有節點元素的值兩兩都不相同),要求後序遍歷的結果。做法是先找到先序遍歷的第乙個元素,它肯定是這棵樹的根節點元素的值;然後到中序遍歷結果中找這個值,那麼中序遍歷中這個值前面的所有元素都是根節點的左子樹的節點的值,後面的所有元素都是根節點你的右子樹的節點的值。現在我們對左右子樹分別進行相同的操作,即遞迴呼叫當前的這個函式,就能構造出一棵完整的二叉樹。

同理的,假如我們已經知道了後序遍歷和中序遍歷的結果,一樣能夠用相同的方法還原這棵二叉樹。

但是,如果知道了先序遍歷和後序遍歷的結果,能不能還原這可二叉樹呢?答案是不能。因為先序遍歷和後序遍歷本質上是一樣的,先序遍歷是先訪問根節點再遍歷左右子樹,後序遍歷是先遍歷左右子樹再訪問根節點,因此我們即使知道了根節點也不能區分出左右子樹。但是如果是中序遍歷,我們知道了它的根節點就能知道它的左右子樹,所以中序遍歷在還原二叉樹過程中是最重要的。不過僅僅知道中序遍歷我們並不能知道哪個是它的根節點元素的值,所以還得通過先序遍歷或者後序遍歷來找到根節點。

下面是我寫的通過先序遍歷和中序遍歷結果還原二叉樹的程式》_<:

#include

using

namespace

std;

template

struct treenode

treenode(t v):val(v), left(nullptr), right(nullptr) {}

};//思路:先序遍歷的第乙個元素肯定是根節點,那麼我們再在中序遍歷中找到這個根節點,此時中序遍歷根節點左邊的元素全是根節點左子樹的元素,利用遞迴我們可以繼續查詢,直到構建一顆完整的樹(這兒說的根節點都是指當前子樹的根節點)

template

void gettree(t* preorderarr, t* inorderarr,int end,treenode*& node,treenode*& finalroot)

//傳入節點,輸出以該節點為根的子樹的後序遍歷結果

template

void postorder(treenode* node)

}int main()

; char in = ;

//測試2

char pre2 = ;

char in2 = ;

treenode* root = nullptr;

gettree(pre2, in2, 11, root, root);

postorder(root);

system("pause");

}

二叉樹先序遍歷 中序遍歷 後序遍歷

輸入二叉樹的先序遍歷序列和中序遍歷序列,輸出該二叉樹的後序遍歷序列。非建二叉樹版本 include includeusing namespace std string preord,inord void rebuild int preleft,int preright,int inleft,int ...

二叉樹 先序遍歷 中序遍歷 後續遍歷

package com.example.ljia.structure.tree import lombok.data author samlai description 遞迴 二叉樹 先序遍歷 中序遍歷 後續遍歷 先序遍歷 根 左 右 中序遍歷 左 根 右 後序遍歷 左 右 根 發現規律 這裡的順序...

二叉樹先序遍歷 後序遍歷 中序遍歷

從根部 a 開始,然後開始遍歷左子樹,直接找到 b 檢視 b 有沒有左子樹,有 d,再檢視 d 有沒有子樹,沒有,d 已經是葉子,所以第二個是 d。倒回去,取中 b,第三個數是 b。檢視 b 有沒有右子樹,有 e 檢視 e 有沒有子樹,有 g 左 h 右 所有後面三個數是 egh 先查左子樹,存在繼...