在講遍歷以前,咱們要先建立一個樹:node
#include <iostream> using namespace std; typedef struct node; typedef node *tree; struct node{ int data; // 結點數值 tree left,right; // 左子樹和右子樹 }; tree bt;
遍歷二叉樹有三種方式:ios
先序遍歷的操做以下:post
二叉樹bt的先序遍歷結果:12347536spa
代碼以下:code
void preorder(tree bt){ if (bt){ // 判斷不爲空二叉樹 cout << bt.data; preorder(bt.left); // 遞歸遍歷左子樹 preorder(bt.right); // 遞歸遍歷右子樹 } }
中序遍歷的操做以下:blog
二叉樹bt的中序遍歷結果:7425136遞歸
代碼以下:io
void inorder(tree bt){ if (bt){ // 判斷不爲空二叉樹 inorder(bt.left); // 遞歸遍歷左子樹 cout << bt.data; inorder(bt.right); // 遞歸遍歷右子樹 } }
後序遍歷的操做以下:class
二叉樹bt的後序遍歷的結果:7452631stream
代碼以下:
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*+
怎麼將中綴表達式轉換爲前綴表達式或後綴表達式呢?只需像前序遍歷和後序遍歷同樣遍歷表達二叉樹便可。