C++樹——遍歷二叉樹


在講遍歷之前,我們要先創建一個樹:

#include <iostream>
using namespace std;
typedef struct node;
typedef node *tree;

struct node{
    int data;               // 結點數值
    tree left,right;        // 左子樹和右子樹 
};
tree bt;

遍歷二叉樹有三種方式:

先序遍歷


先序遍歷的操作如下:

  1. 訪問根結點
  2. 先序遍歷左子樹(遞歸)
  3. 先序遍歷右子樹(遞歸)

二叉樹bt的先序遍歷結果:12347536

代碼如下:

void preorder(tree bt){
    if (bt){                // 判斷不為空二叉樹 
        cout << bt->data;
        preorder(bt->left);  // 遞歸遍歷左子樹 
        preorder(bt->right); // 遞歸遍歷右子樹 
    }
}

中序遍歷


中序遍歷的操作如下:

  1. 中序遍歷左子樹(遞歸)
  2. 訪問根結點
  3. 中序遍歷右子樹(遞歸)

二叉樹bt的中序遍歷結果:7425136

代碼如下:

void inorder(tree bt){
    if (bt){                // 判斷不為空二叉樹 
        inorder(bt->left);   // 遞歸遍歷左子樹 
        cout << bt->data;
        inorder(bt->right);  // 遞歸遍歷右子樹 
    }
}

后序遍歷


 

后序遍歷的操作如下:

  1. 后序遍歷左子樹(遞歸)
  2. 后序遍歷右子樹(遞歸)
  3. 訪問根結點

二叉樹bt的后序遍歷的結果:7452631

代碼如下:

void postorder(tree bt){
    if (bt){                // 判斷不為空二叉樹 
        postorder(bt->left);    // 遞歸遍歷左子樹 
        postorder(bt->right); // 遞歸遍歷右子樹 
        cout << bt->data;
    }
}

小結:我們使用遞歸的方式遍歷了二叉樹,大家仔細觀察可以發現,先序遍歷就是先訪問根結點,再遞歸,中序遍歷是把訪問根結點放中間,后續遍歷是最后訪問。

總代碼:

#include <iostream>
using namespace std;
typedef struct node;
typedef node *tree;

struct node{
    int data;                // 結點數值
    tree left,right;        // 左子樹和右子樹 
};
tree bt;

void preorder(tree bt){
    if (bt){                // 判斷不為空二叉樹 
        cout << bt->data;
        preorder(bt->left);    // 遞歸遍歷左子樹 
        preorder(bt->right); // 遞歸遍歷右子樹 
    }
}
void inorder(tree bt){
    if (bt){                // 判斷不為空二叉樹 
        inorder(bt->left);    // 遞歸遍歷左子樹 
        cout << bt->data;
        inorder(bt->right); // 遞歸遍歷右子樹 
    }
}
void postorder(tree bt){
    if (bt){                // 判斷不為空二叉樹 
        postorder(bt->left);    // 遞歸遍歷左子樹 
        postorder(bt->right); // 遞歸遍歷右子樹 
        cout << bt->data;
    }
}

補充芝士:

表達式:a+b*c

表達式二叉樹:

前綴表達式(波蘭式):+a*bc

中綴表達式:a+b*c/d

后綴表達式(逆波蘭式):abc*+

怎么將中綴表達式轉換為前綴表達式或后綴表達式呢?只需像前序遍歷和后序遍歷一樣遍歷表達二叉樹即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM