資料結構 二叉樹的遍歷及應用

2021-08-20 13:48:41 字數 3629 閱讀 2107

在二叉樹的應用中,常常要求在樹中查詢某些結點,或者對樹中的結點統一進行某種處理。因此,就提到了二叉樹的遍歷問題,對於線性結構來說,遍歷是乙個很容易解決的問題,而二叉樹偏偏是一種非線性的結構,因此需要尋找一種規律。

二叉樹由三個基本單元組成,分別是根結點、左子樹及右子樹。依次遍歷這三個部分就能遍歷整個二叉樹,以v、l、r表示訪問根結點、遍歷左子樹及遍歷右子樹,則有vlr、vrl、rlv、rvl、lvr、lrv六種遍歷二叉樹的方案。若規定左子樹一定先於右子樹被遍歷,就只剩下三種情況。再根據根結點被訪問的次序,可以分為可以分別命名為先(根)序遍歷,中(根)序遍歷,後(根)序遍歷。

為了方便理解,定義乙個二叉樹的結點型別和二叉樹型別;

templateclass binarytree;

templateclass binarytreenode

private:

t data;

binarytreenode *lchild ;

binarytreenode *rchild ;

};templateclass binarytree

binarytree(binarytreenode *node)

void preorder();

void preorder(binarytreenode *current);

void inorder();

void inorder(binarytreenode *current);

void pastorder();

void pastorder(binarytreenode *current);

private:

binarytreenode *root=null;

};

構建乙個如下圖的二叉樹;

先序遍歷的規則如下:若當前二叉樹為空,則返回空,否則

1.  訪問根結點;

2.  先序遍歷左子樹;

3.  先序遍歷右子樹;

上圖中的二叉樹的先序遍歷為:abdehijkcfg

根據上面的關係,可以寫出二叉樹類的先序遍歷的函式;

中序遍歷的規則如下:若當前二叉樹為空,則返回空,否則

1.  中序列根結點的左子樹;

2.  訪問根結點;

3.  中序遍歷根結點的右子樹;

上圖中的二叉樹的中序遍歷為:dbhejikafcg

根據上面的關係,可以寫出二叉樹類的中序遍歷的函式;

後序遍歷的規則如下:若當前二叉樹為空,則返回空,否則

1.  後序列根結點的左子樹;

2.  後序遍歷根結點的右子樹;

3.  訪問根結點;

上圖中的二叉樹的後序遍歷為:dhjkiebfgca

根據上面的關係,可以寫出二叉樹類的後序遍歷的函式;

計算二叉樹的節點的格式可以利用二叉樹的遍歷,常用的是後遍歷,先遍歷根結點的左子樹和右子樹,分別計算出左右子樹的結點個數,然後加上根結點個數就是整個二叉樹節點個數。

與計算二叉樹節點高度類似,計算二叉樹高度時如果高度為0,返回-1;否則按照後序遍歷規則,先遞迴計算根結點的左子樹和右子樹的高度,再求兩者中的較大者,並加1,最終得到整個二叉樹的高度;

有一些題目喜歡提這樣的問題,以知道先序和中序求後序為例,例如已知先序是abdehijkcfg,已知中序是dbhejikafcg,求二叉樹的後序排列。(知道先序和後序是無法求出中序的

其實了解二叉樹的遍歷後,這個題目很簡單。由於先序是先遍歷根結點,先序排列的第乙個點必定根結點,也就是說a是根結點;再看中序遍歷,先遍歷左子樹,左子樹遍歷玩才會遍歷根結點,因此,排在a前方的全是左子樹上的點,排在a後方的全是,如果a在中序排列中也是排在第乙個,說明它沒有左子樹。因此有了如下結構;

再看左子樹,此時左子樹的先序為bdehijk,中序為dbhejik。同樣的道理,b為a的左子樹的根結點,中序排列中在b前面的為左子樹,排在b後側的為右子樹;如此反覆進行就能得出二叉樹的結構,再進行後序遍歷就能得出後序排列。

當知道後序和中序排列求先序排列時,也是同樣的道理,二叉樹的根結點是最後被遍歷到的點。

根據上面的關係,可以的寫出重建二叉樹的函式;

templatebinarytreenode* binarytreenode::reconstructbinarytree(vectorpre, vectorin)

} for (int j = 1; j < size; j++)

if (j>i) //先序序列:排在根結點之後的放入右子樹

}if (leftin.size() != 1)

if (rightin.size() != 1)

} return bitree;

}

二叉樹的應用非常多,例如堆排序,二叉排序樹,霍夫曼樹等等,需要更多地去了解。

已完。

mysql 遍歷二叉樹 資料結構 二叉樹遍歷

這篇博文主要是研究二叉樹遍歷的遞迴與非遞迴演算法,有興趣的小夥伴可以了解下!二叉樹的遞迴遍歷 深度優先遍歷 先來張圖,看看各結點遍歷時的情況 二叉樹深度優先遍歷總結 分別為第一次,第二次,第三次進入某個結點 先序遍歷 先訪問根結點,然後先序遍歷左子樹,最後先序遍歷右子樹 根 左 右 中序遍歷 先中序...

資料結構 遍歷二叉樹

資料結構實驗之二叉樹二 遍歷二叉樹 time limit 1000ms memory limit 65536kb submit statistic problem description 已知二叉樹的乙個按先序遍歷輸入的字串行,如abc,de,g,f,其中,表示空結點 請建立二叉樹並按中序和後序的方...

資料結構 遍歷二叉樹

二叉樹的遍歷原理 二叉樹的遍歷是指從根節點出發,按照某種次序以此訪問二叉樹所有節點,使得每個節點被訪問一次且僅被訪問一次 二叉樹遍歷方法 1.前序遍歷 規則是若二叉樹為空,則空操作返回,否則先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹 2.中序遍歷 規則是若樹為空,則空操作返回,否則從根節點開...