在二叉樹的應用中,常常要求在樹中查詢某些結點,或者對樹中的結點統一進行某種處理。因此,就提到了二叉樹的遍歷問題,對於線性結構來說,遍歷是乙個很容易解決的問題,而二叉樹偏偏是一種非線性的結構,因此需要尋找一種規律。
二叉樹由三個基本單元組成,分別是根結點、左子樹及右子樹。依次遍歷這三個部分就能遍歷整個二叉樹,以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. 訪問根結點;上圖中的二叉樹的先序遍歷為:abdehijkcfg2. 先序遍歷左子樹;
3. 先序遍歷右子樹;
根據上面的關係,可以寫出二叉樹類的先序遍歷的函式;
中序遍歷的規則如下:若當前二叉樹為空,則返回空,否則
1. 中序列根結點的左子樹;上圖中的二叉樹的中序遍歷為:dbhejikafcg2. 訪問根結點;
3. 中序遍歷根結點的右子樹;
根據上面的關係,可以寫出二叉樹類的中序遍歷的函式;
後序遍歷的規則如下:若當前二叉樹為空,則返回空,否則
1. 後序列根結點的左子樹;上圖中的二叉樹的後序遍歷為:dhjkiebfgca2. 後序遍歷根結點的右子樹;
3. 訪問根結點;
根據上面的關係,可以寫出二叉樹類的後序遍歷的函式;
計算二叉樹的節點的格式可以利用二叉樹的遍歷,常用的是後遍歷,先遍歷根結點的左子樹和右子樹,分別計算出左右子樹的結點個數,然後加上根結點個數就是整個二叉樹節點個數。
與計算二叉樹節點高度類似,計算二叉樹高度時如果高度為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.中序遍歷 規則是若樹為空,則空操作返回,否則從根節點開...