按照層次序實現二叉樹遍歷。
對於上圖中的二叉樹,層次遍歷的實現結果如下
層次遍歷的過程天然地符合佇列這個資料結構,因此可以用佇列方法來非遞迴地實現層次遍歷。目前還不太清楚如何遞迴地實現層次遍歷,網上看到的一些解法,聲稱採用了遞迴方法進行層次遍歷,但是它們是在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...