二叉樹各種遍歷方式(遞迴與非遞迴)

2021-08-28 04:07:12 字數 1623 閱讀 7206

1、第i層至多有2的 i -1次方個結點;

2、深度為k的二叉樹至多有2^(k) -1個結點;

3、葉子結點個數為n,雙結點個數為m,則  n = m + 1

4、遞迴遍歷方式**簡單,效率低;非遞迴遍歷方式**較複雜,效率高

5、層序遍歷需要借助(queue)實現,前、中、後序遍歷需借助棧(stack)實現。

typedef struct node_t

}node_t;

訪問順序:value——>左子樹——>右子樹

1、遞迴演算法

void preorderrecursion(node_t *root)

}

2、非遞迴演算法

思路:root節點先進棧,訪問棧頂元素,訪問後出棧同時,右節點先入棧,左節點再入棧。

void preorder(node_t *root)

stacks;

node_t *p = root;

s.push(root);

while(!s.empty())

if(p->left)

}}

訪問順序:左子樹——>value——>右子樹

1、遞迴演算法

void midorderrecursion(node_t *root)

}

2、非遞迴演算法

思路:root節點先進棧,迴圈將左子樹入棧,開始訪問棧頂元素,訪問後出棧同時將棧頂元素的右子樹入棧。

void midorder(node_t *root)

s.pop(); //pop out the nullptr

if(!s.empty())

}}

訪問順序:左子樹——>右子樹——>value

1、遞迴演算法

void postorderrecursion(node_t *root)

}

2、非遞迴演算法

思路:迴圈將左子樹入棧,開始檢查棧頂元素的右子樹,如果右子樹為空或者右子樹已被訪問,即可訪問當前棧頂元素。

如果之前訪問過的節點last恰為該節點的右節點,說明其右子樹已經訪問完,應該訪問該棧頂元素。

void postorder(node_t *root)

p = s.top();

if(p->right && p->right != last)else

}}

思想:需要借助queue來對節點進行快取,先進佇列的節點需要先離開

void levelorder(node_t *root)

queueq;

node_t *p = nullptr;

q.push(root);

while(!q.empty())

if(p->right)

}}

二叉樹各種遞迴非遞迴層次遍歷

typedef struct bitnode bitnode,bitree 注意這裡面的下方的bitnode代表 struct bitnode bitree代表 struct bitnode的指標 直接上程式 沒有什麼特別的難點,除了後序非遞迴遍歷需要些2個棧進行維護可能處理需要操作多一點,考研不容...

二叉樹的遍歷方式(遞迴 非遞迴)

二叉樹的前序 中序 後序遍歷方式,遞迴與非遞迴。層序遍歷的方式已經在之前的部落格中寫過 遞迴方式比較簡單。前序遍歷 void preorder treenode root 前序遍歷非遞迴 基本思路 利用棧。先輸出結點值,再入棧。然後遍歷左子樹。退棧時,遍歷棧頂結點的右子樹。void preorder...

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...