二叉數的中序遍歷原理及例題Leetcode(94. 二叉樹的中序遍歷 c++實現)
1.中序遍歷
中序遍歷的步驟為 : 遍歷左孩子--> 遍歷根節點-->遍歷右孩子
如上圖,這顆樹由5個節點,A,B,C,D,E組成。其中a為根節點 ,b為左子樹,cde為右子樹
遍歷順序為 A (根節點) ----> B(左子樹) ---> (右子樹)
其中右子樹又包含三個節點cde,在右子樹中,c為根節點,d為左子樹,e為右子樹
遍歷順序為 C(根節點) ----> D(左子樹) ---> E(右子樹)
所以總的遍歷順序為A ->B->C->D->E
2.中序遍歷的實現
知道了原理,實現就很簡單了。
我們可以定義一個函式midorder()
midorder(根節點的地址)
{
if (根節點空)退出;
if (左子樹非空):
midorder(左子樹的地址);
遍歷根節點;
if (右子樹非空):
midorder(右子樹的地址);
}
=========程式碼實現如下=====
voidmidorder(TreeNode *root)
{
if (!root);
if (root ->left) midorder(root -> left) ;
if (root ->right) midorder(root -> right) ;
}
3.例題Leetcode(94. 二叉樹的中序遍歷 c++實現)
如上圖註釋所示,樹的資料結構為:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
}
將樹中序遍歷的程式碼如下:
class Solution {
public:
vector<int> inorderTraversal(TreeNode* root) {
midorder(root)
}
void midorder(TreeNode *root)
{
if (!root) return ;
if (root ->left) midorder(root -> left) ;
}
};
此程式碼只是把樹中序遍歷一遍,現在,我們要把遍歷的東西儲存在陣列中,原始碼如下。
classSolution{
public:
vector<int>inorderTraversal(TreeNode*root){
vector<int>resultarray;//定義需要返回的結果陣列
midorder(root,resultarray);
returnresultarray;
}
voidmidorder(TreeNode*root,vector<int>&res)//多定義一個需要返回的函式
{
if(!root)return;
if(root->left)midorder(root->left,res);
res.push_back(root->val);//push_back函式:在陣列末尾追加東西
if(root->right)midorder(root->right,res);
}
};