1. 程式人生 > 實用技巧 >二叉數的中序遍歷原理及例題Leetcode(94. 二叉樹的中序遍歷 c++實現)

二叉數的中序遍歷原理及例題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) ;

if (root ->right) midorder(root -> right) ;
}
};

此程式碼只是把樹中序遍歷一遍,現在,我們要把遍歷的東西儲存在陣列中,原始碼如下。

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);

}

};