紅黑樹也是二叉樹,這裡只是說明對樹的遍歷訪問。插入、 查詢、 刪除 等操作參看紅黑樹那裡
1、深度優先搜尋:每種都有遞迴和迭代兩種實現(迭代需要借助stack)
前序遍歷:10,6,4,8,14,12,16
中序遍歷:4,6,8,10,12,14,16(如果是二叉排序樹就是輸出排序結果了哈)
後序遍歷:4,8,6,12,16,14,10
a.遞迴實現
遞迴實現相當簡單:
void preorder(btree *tree)
b.迭代實現
重點說下迭代實現:(有左子樹就一直訪問下去,直到沒了再看右子樹。感覺右子樹都是掛在左子樹上的啊。。。)
前序
void preorder2(btree *root) //非遞迴前序遍歷,按前序遍歷走一遍就能理解他的思路了
//最後p肯定是乙個葉子節點了(null)才退出while
if(!s.empty()) //}}
中序
void inorder2(btree *root) //非遞迴中序遍歷
if(!s.empty())}}
後序
//非遞迴後序遍歷相對複雜,可以沿承上面的做法,那就要在拿到s.top時候看是不是第一次處於top,如果是,那說明右子樹還沒有被訪問呢,那就只是置flag,
//直接把右邊孩子繼續push。當第二次位於棧頂的時候就是該pop並訪問此節點的時候。(這種做法需要在每個node裡面加個flag)
void postorder2(btree *root) //非遞迴後序遍歷
if(!s.empty())
else //第二次出現在棧頂}}
}//還有一種做法:
void postorder2(bintree *root) //非遞迴後序遍歷
else}}
2、寬度優先搜尋
10,6,14,4,8,12,16。實現的話需要借助queue:
比如上面,a入隊,queue
a出隊,並將a的所有child入隊(bc入隊),queue
b出隊,並將b的所有child入隊(de入隊),queue
由二叉樹的遍歷引申出求二叉樹的深度,
int gettreedeep(bintree bt) //類似後序遍歷
return deep;
}
構建二叉樹 遍歷二叉樹
陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...
二叉樹相關演算法(一) 二叉樹的遍歷
遞迴方式會導致每個節點會經過三次,先序是在第一次經過節點時訪問,中序是第二次經過節點時訪問,後序是第三次經過節點時訪問。其中較為特殊的是葉子節點,左孩子和右孩子都為空,訪問空樹時什麼都不做就返回。public static void p node h 1 利用棧來進行實現,三種演算法在理解的基礎上進...
二叉樹遍歷相關演算法實現
include include include using namespace std typedef int elemtype typedef struct treet treet,ptreet class bitree ptreet bitree insert elemtype target,p...