建立二叉樹:
由於先序、中序、后序遍歷的任何一個遍歷結果單獨都不能唯一確定一顆二叉樹,因此不能直接使用其中任何一個遍歷結果來構造二叉樹(原因是不能確定左右子樹的大小(節點數),或者說不知道子樹的結束位置)
雖然先序、中序、后序遍歷任意兩種遍歷結果相結合都可以唯一確定一顆二叉樹,但是很不方便。
所以:只要輸入為‘#’就表示該樹為空,稱為擴展二叉樹 例輸入:ABD##E##C#F##
二叉鏈表存儲:
struct node { char data; struct node *L_tree; struct node *R_tree; };
struct node *creat_tree()//建立二叉樹 { char ch; ch = getchar(); struct node *Tree; Tree = (struct node *)malloc(sizeof(struct node)); if(ch == '#') Tree = NULL; else { Tree->data = ch;//輸入本節點信息 Tree->L_tree = creat_tree();//建左子樹 Tree->R_tree = creat_tree(); } return Tree; }
遞歸先序遍歷:
void preorder_first(struct node *tree)//先序遍歷 { if(tree != NULL) { cout << tree->data << " "; preorder_first(tree->L_tree); preorder_first(tree->R_tree); } }
遞歸中序遍歷:
void preorder_second(struct node *tree)//中序遍歷 { if(tree != NULL) { preorder_second(tree->L_tree); cout << tree->data << " "; preorder_second(tree->R_tree); } }
遞歸后序遍歷:
void preorder_third(struct node *tree)//后序遍歷 { if(tree != NULL) { preorder_third(tree->L_tree); preorder_third(tree->R_tree); cout << tree->data << " "; } }
求樹的深度:tree=NULL 時高度為0。不為空時當前tree高度是其左右子樹高度的最大值+1,左右子樹也是二叉樹,規模變小求解一樣用遞歸
int high(struct node *tree)//數的深度 { if(tree == NULL) return 0; else return (max(high(tree->L_tree),high(tree->R_tree))+1); }
求樹中節點數:
void nodecount(struct node *tree)//節點個數 { if(tree != NULL) { n++;//先序遍歷計數 nodecount(tree->L_tree); //n++;//中序遍歷計數 nodecount(tree->R_tree); //n++;//后序遍歷計數 } }
求樹中葉節點數:
void ye_node(struct node *tree)//葉節點的個數 { if(tree != NULL) { if(tree->L_tree == NULL && tree->R_tree == NULL) { n1++; } ye_node(tree->L_tree); ye_node(tree->R_tree); } }
求樹中度為 2 的節點個數:
void have_two_node(struct node *tree)//度為2的節點的個數 { if(tree != NULL) { if(tree->L_tree != NULL && tree->R_tree != NULL) { n2++; } have_two_node(tree->L_tree); have_two_node(tree->R_tree); } }