建立二叉樹:
由於先序、中序、后序遍歷的任何一個遍歷結果單獨都不能唯一確定一顆二叉樹,因此不能直接使用其中任何一個遍歷結果來構造二叉樹(原因是不能確定左右子樹的大小(節點數),或者說不知道子樹的結束位置)
雖然先序、中序、后序遍歷任意兩種遍歷結果相結合都可以唯一確定一顆二叉樹,但是很不方便。
所以:只要輸入為‘#’就表示該樹為空,稱為擴展二叉樹 例輸入: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);
}
}
