二叉樹的遍歷方式(遞迴)
部落格摘要:
一. 什麼是二叉樹
簡述:二叉樹的每個結點至多只有二棵子樹(不存在度大於2的結點),二叉樹的子樹有左右之分,次序不能顛倒。
二.四種遍歷
本篇部落格講述二叉樹的四種遍歷:前序遍歷,中序遍歷,後序遍歷,層序遍歷;
1.前序遍歷:先訪問當前結點,再訪問當前結點的左子樹結點,最後訪問當前結點的右子樹的結點;
2.中序遍歷:先左再中(代表當前結點的意思)最後右結點;
3.後序遍歷:先左再右最後中;
4.層序遍歷:望文生義,就是一層一層的遍歷,預設每層左到右遍歷;
這棵二叉樹的四種遍歷結果:
//前序遍歷:1 2 3 4 5 6
//中序遍歷:3 2 4 1 6 5
//後序遍歷:3 4 2 6 5 1
//層序遍歷:1 2 5 3 4 6
三.遞迴的實現遍歷
首先,我們得有一棵二叉樹,我們給出乙個序列,先通過這個序列構造出一顆二叉樹:
int array[10] = ;
//構造出結點
templatet> //模板
struct
binarynode
};
然後需要構造出二叉樹,構造二叉樹時我們也需要一種順序來構造,一般預設為前序;
template
class binarytree
//帶引數的建構函式
binarytree (t* a, size_t size, const t& invalid)
//拷貝構造;
binarytree (const binarytree & tree)
private:
node _root;
}//為什麼我在這裡不先實現構造的具體**,是因為,我們要講幾種遍歷,現在只需要了解大體框架就好;
看了上面的大體框架之後,我們就可以開始遞迴遍歷的具體演算法實現了;
//下面的這些函式都是實現在protected修飾的下面的,都需要用公有的方法去呼叫,為了安全;
比如:
public:
void
posorder()
//中序遍歷
void _inorder(node root)
//前序遍歷
void _prevorder(node root)
//層序遍歷的話就需要具體的說一下了,層序遍歷需要用佇列來輔助實現;
//首先,層序遍歷:一層一層的遍歷,就例如上面給出的那個例子,層序遍歷的結果是:1,2,5,3,4,6;
可以看出來是先把1訪問了,再訪問它的左右孩子,然後再以2為父節點訪問它的左右孩子,然後是5的組有孩子;
依據這個規律我們可以借助佇列來實現,佇列是先進先出的,那麼,我們先讓1進入佇列,然後將1的左右孩子依次放進佇列,訪問隊頭結點,以此類推;
過程如下:
先把根結點(最頂層的那個結點)放入佇列;
如果佇列不為空;
queue(佇列):1;
訪問隊頭元素;
1 的左右孩子(如果不為null)依次放入佇列:
queue:1 2 5;
刪除隊頭;
如果佇列不為空;
queue:2 5;
訪問隊頭元素2;
2的左右孩子(如果不為null)依次放入佇列:
queue: 5 3 4;
刪除隊頭;
如果佇列不為空;
queue:5 3 4;
訪問隊頭元素5;
5的左右孩子(如果不為null)依次放入佇列:
queue: 5 3 4 6;
刪除隊頭;
如果佇列不為空;
queue:3 4 6;
訪問隊頭元素3;
3的左右孩子(如果不為null)依次放入佇列:
queue: 3 4 6;
刪除隊頭;
如果佇列不為空;
queue:4 6;
訪問隊頭元素4;
4的左右孩子(如果不為null)依次放入佇列:
queue: 4 6;
刪除隊頭;
如果佇列不為空;
queue:6;
訪問隊頭元素6;
6的左右孩子(如果不為null)依次放入佇列:
queue: ;
刪除隊頭;
如果佇列不為空;
此時隊列為空,結束!
層序遍歷
void levelorder1()
}
二叉樹的遍歷 遞迴方式
概述 用遞迴方式實現二叉樹的遍歷。二叉樹結構 public class node 先序遍歷 先遍歷根結點,再遍歷左子樹,最後遍歷右子樹 public void preorderrecur node head system.out.print head.value 先遍歷根節點 preorderrec...
二叉樹的遍歷方式(遞迴 非遞迴)
二叉樹的前序 中序 後序遍歷方式,遞迴與非遞迴。層序遍歷的方式已經在之前的部落格中寫過 遞迴方式比較簡單。前序遍歷 void preorder treenode root 前序遍歷非遞迴 基本思路 利用棧。先輸出結點值,再入棧。然後遍歷左子樹。退棧時,遍歷棧頂結點的右子樹。void preorder...
二叉樹的遍歷 非遞迴方式
分別用非遞迴的方式實現二叉樹的先序遍歷 中序遍歷和後續遍歷 非遞迴方式實現二叉樹的先序遍歷。過程 1.申請乙個新的棧,記為stack,然後將二叉樹的頭結點head壓入stack中。2.從stack中彈出棧頂結點,記為cur,然後列印cur結點的值,再將結點cur的右孩子 不為空的話 先壓入stack...