二叉樹遍歷相關

2021-09-14 03:42:06 字數 1468 閱讀 4698

紅黑樹也是二叉樹,這裡只是說明對樹的遍歷訪問。插入、 查詢、 刪除 等操作參看紅黑樹那裡

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...