二叉樹系列 3 層序遍歷的非遞迴實現

2021-06-18 04:40:57 字數 4101 閱讀 6036

按照層次序實現二叉樹遍歷。

對於上圖中的二叉樹,層次遍歷的實現結果如下

層次遍歷的過程天然地符合佇列這個資料結構,因此可以用佇列方法來非遞迴地實現層次遍歷。目前還不太清楚如何遞迴地實現層次遍歷,網上看到的一些解法,聲稱採用了遞迴方法進行層次遍歷,但是它們是在while迴圈中進行的遞迴,是一種偽遞迴。由此有可以猜測,可能這種遍歷表現出來的資料訪問方式確實不匹配遞迴的演算法。下面僅僅給出層次遍歷的非遞迴解法。

void level_order_2(link t, void (*visit)(link))

return;

}

下面是完整的檔案,主要實現了二叉樹的前序,中序,後序,層序的遍歷。有bintree.h,bintree.cpp,main.cpp

以下為bintree.h

#ifndef bintree_h

#define bintree_h

typedef struct node* link;

struct node;

struct tag_node;

link init(int vlr,int lvr,int n);

void pre_order(link t, void (*visit)(link));//遞迴前續遍歷

void pre_order_2(link t, void (*visit)(link));//非遞迴前續遍歷

void in_order(link t, void (*visit)(link));//遞迴中續遍歷

void in_order_2(link t, void (*visit)(link));//非遞迴中續遍歷

void post_order(link t, void (*visit)(link));//遞迴後續遍歷

void post_order_2(link t, void (*visit)(link));//非遞迴後續遍歷第一種

void post_order_3(link t, void (*visit)(link)); //非遞迴後續遍歷第二種

void level_order(link t, int level, void (*visit)(link));//層序遍歷遞迴,

void level_order_2(link t, void (*visit)(link));//層序遍歷非遞迴

int count(link t);

int depth(link t);

int count_leaf(link t);

int count_non_leaf(link t);

link mirror_tree(link parent_t,link copy_t, int is_left);

void destroy(link t);

#endif

以下為bintree.cpp

#include #include #include #include "bintree.h"

static link make_node(int item)

static void free_node(link p)

link init(int vlr, int lvr, int n)

//前序遞迴

void pre_order(link t, void (*visit)(link))

//前序非遞迴

void pre_order_2(link t, void (*visit)(link))

}//中序遞迴

void in_order(link t, void (*visit)(link))

//中序非遞迴

void in_order_2(link t, void (*visit)(link))

//找到當前節點的最深最深最深的左兒子

if(!s.empty())

}

}//後序遞迴

void post_order(link t, void (*visit)(link))

//後序非遞迴第一種

void post_order_2(link t, void (*visit)(link))

else

}

return;

}//後序非遞迴第二種

void post_order_3(link t, void (*visit)(link))

if(!s.empty())

else //第二次出現在棧頂

}}

return;

}//層序遞迴

void level_order(link t, int level, void (*visit)(link))

//層序非遞迴

void level_order_2(link t, void (*visit)(link))

return;

}int count(link t)

int depth(link t)

int count_leaf(link t)

int count_non_leaf(link t)

link mirror_tree(link parent_t,link copy_t, int is_left)

void destroy(link t)

以下為main.cpp

//#include #include "bintree.h"

void print_item(link p)

int main(int argc, char* argv)

; //int in_seq = ;

//test_data_2

int pre_seq = ;

int in_seq = ;

//test_data_3

//int pre_seq = ;

//int in_seq = ;

//link root = init(pre_seq,in_seq,7);

link root = init(pre_seq,in_seq,9);

printf("count=%d, depth=%d, leaf=%d, non_leaf=%d\n",count(root),depth(root),count_leaf(root),count_non_leaf(root));

putchar('\n');

putchar('\n');

pre_order(root, print_item);

putchar('\n');

pre_order_2(root, print_item);

putchar('\n');

in_order(root, print_item);

putchar('\n');

in_order_2(root, print_item);

putchar('\n');

post_order(root, print_item);

putchar('\n');

post_order_2(root, print_item);

putchar('\n');

post_order_3(root, print_item);

putchar('\n');

putchar('\n');

level_order_2(root, print_item);

putchar('\n');

putchar('\n');

link root2 = mirror_tree(null,root,-1);

in_order(root2, print_item);

putchar('\n');

putchar('\n');

destroy(root);

destroy(root2);

return 0;

}以下為main函式的執行結果

二叉樹的實現, 遍歷 遞迴, 非遞迴, 層序

include binarytree.h include stack.h include queue.h 通過前序遍歷的陣列 abd e h cf g 構建二叉樹 btnode binarytreecreate btdatatype str,int idx else 二叉樹銷毀 void binar...

二叉樹層序遍歷 求二叉樹的層序遍歷

給定乙個二叉樹,返回該二叉樹層序遍歷的結果,從左到右,一層一層地遍歷 例如 給定的二叉樹是,該二叉樹層序遍歷的結果是 3 9,20 15,7 示例1 輸入 返回值 1 2 示例2輸入 返回值 1 2,3 4,5 解題思路 重點是如何把在一層的節點放到一起,設定乙個引數專門放一層的節點 class t...

非遞迴中序遍歷二叉樹

非遞迴中序遍歷二叉樹 include define maxsize 100 typedef char datatype 二叉鍊錶型別定義 typedef struct binnode binnode,bintree 順序棧型別定義 typedef struct seqstk 初始化棧 int ini...