二叉樹的構造和遍歷

2021-07-12 02:51:09 字數 2860 閱讀 8782

// 二叉樹節點定義

typedef struct bnode

bnode, *btree;

// 建立二叉樹

int creatbtree(btree &tree)

return0;}

// 刪除二叉樹

int destorybtree(btree tree)

//if (tree)

//return

0;}

// 訪問二叉樹

void visit(btree tree)

// 遞迴方式

void preorder(btree tree)

}

// 前序遍歷的非遞迴版本

// 分析過程

/*分析:

「右子樹之間」的訪問順序呈現棧規律即「先入棧後訪問」

前序遍歷:

1 優先訪問根節點和左子樹,其右子樹的根節點入棧暫存

2 右子樹的根節點出棧後的按照1的順序訪問

*/void preorder2(btree tree)

else

}}

//先序遍歷(非遞迴)

//訪問t->data後,將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,再先序遍歷t的右子樹。

void preorder3(btree tree) else

}}

// 遞迴遍歷

void midorder(btree tree)

}

// 中序遍歷的非遞迴版本

// 分析過程

/*分析

根節點與左子樹呈現棧的規律

不同根節點的右子樹之間呈現棧的規律

注:把樹劃分成由只由左子樹組成樹好理解!!!

遍歷1 若根節點存在,根節點入棧

2 左子樹入棧,直到左子樹的根節點沒有左子樹(左節點)

3 左子樹根節點出棧並訪問,使用右子樹的根節點更新原根節點資訊,迴圈執行1、2、3

*/void midorder2(btree tree)

else

}}

// 遞迴遍歷

void postorder(btree tree)

}

// 後序遍歷

/*《思路一》

分析:1 將tree節點入棧,然後沿著左子樹一直搜尋,直到搜尋到沒有左孩子的節點;

2 這個節點出現在棧頂,但不能出棧並訪問它,其有孩子還沒有被訪問。

3 按照 1、2的規則對其右子樹進行處理,這個節點再次出現在棧頂時,出棧並訪問。

注:整個過程中,每個節點都兩次出現在棧頂,節點第二次出現在棧頂時才能訪問它,可以設定乙個bool值來標識。

*/typedef

struct bnodepost

bnodepost, *btreepost;

void postorder2(btree tree)

else

else

// 第二次出現在棧頂

}

}}

/*

《思路二》

分析:後續遍歷特點:根節點在其左孩子有孩子被訪問過之後才能被訪問

1 tree節點入棧

1.1 此節點不存在左孩子右孩子,可以直接訪問它

1.2 此節點存在左孩子或右孩子,但其左孩子或右孩子節點已被訪問過,可以直接訪問該節點

2 非1.1、1.2情況,將tree節點右孩子先入棧,左孩子再入棧,這樣來保證每次取棧頂元素的順序即先訪問左孩子再訪問右孩子。

*/void postorder3(btree tree)

else

}}

// 層次遍歷:典型的bfs

/*分析過程:

層次遍歷以樹的高度來劃分遍歷的層次。

其中,層次遍歷訪問的方式為二叉樹儲存的方式

即:1 2*1 2*1+1 2*2 2*2+1 2*(2*1+1) 2*(2*1+1)+1 ....

那麼層次遍歷就是按二叉樹節點儲存位置順序訪問即可

根-左子節點-右子節點

*//*

執行過程:

1 根節點入棧

2 根節點出棧,訪問根節點

3 根節點的左右子節點入棧

4 重複2、3操作

*/void levelorder(btree tree)

while (!qtree.empty())

}

// 輸入與輸出

//abc##de#g##f###

//先序遍歷 :a b c d e g f

//先序遍歷(非遞迴):a b c d e g f

////中序遍歷 :c b e g d f a

//中序遍歷(非遞迴):c b e g d f a

////後序遍歷 :c g e f d b a

//後序遍歷(非遞迴):c g e f d b a

////層次遍歷 :a b c d e f g

///// a

/// /

/// b

/// / \

/// c d

/// / \

/// e f

/// \

/// g

1 趙4老師版本

2 二叉樹的非遞迴遍歷

二叉樹構造和遍歷

手敲下二叉樹 coding utf 8 class node object def init self,ele 1,left none,right none self.ele ele self.l left self.r right class binarytree object def init ...

二叉樹 中序遍歷和後序遍歷樹構造二叉樹 中等

根據中序遍歷和後序遍歷樹構造二叉樹 你可以假設樹中不存在相同數值的節點 您在真實的面試中是否遇到過這個題?是 給出樹的中序遍歷 1,2,3 和後序遍歷 1,3,2 返回如下的樹 2 1 3 definition of treenode class treenode class solution 左右...

二叉樹構造 二叉樹的廣度優先遍歷

輸入一棵二叉樹的先序遍歷序列和中序遍歷序列,輸出它的廣度優先遍歷序列。第一行為乙個整數t 0為每個測試用例單獨一行輸出廣度優先遍歷序列。2dbacegf abcdefg bcad cbad dbeacgf bcad include include include using namespace st...