基本資料結構——二叉樹的建立,遍歷,求葉子節點,深度計算
阿新 • • 發佈:2019-02-03
/*
新建立一棵二叉樹,遍歷,查詢樹的高度,查詢樹的葉子節點,和總結點數 然後再計算距離最遠的兩個節點。
SQ 2014-04-20
*/
#include<stdio.h>
struct Node{
int data;
struct Node * left;
struct Node * right;
};
typedef struct Node Node;
void creat( tree *p){
int data;
scanf("%d",&data);
if(data == 0){
*p=NULL;
return ;
}
else {
*p=(tree)malloc(sizeof(Node));
(*p)->data = data;
creat(&((*p)->left));
creat(&((*p)->right));
}
}
//二 遍歷整棵樹,這裡採用的是先序遍歷
void show(tree root){
if(root == NULL)
return ;
else {
show(root->left);
printf("%d--->",root->data);
show(root->right);
}
}
//三,查詢樹的葉子節點(很明顯,左右孩子都為空的就是葉子節點)
void find_leaf( tree root){
if(root == NULL)
return ;
else {
find_leaf(root->left);
if(root->left == NULL && root->right == NULL)
printf("葉子節點是:%d\n",root->data);
find_leaf(root->right);
}
}
//, 查詢樹的總節點數:是左子樹的節點總數 + 1 + 右子樹的總節點數
int total(tree root){
if(root == NULL)
return ;
else return (total(root->left) + 1 + total(root->right));
}
//查詢樹的高度 :樹的深度就是其左、右子樹深度的較大值再加1
int max(int a, int b){
if (a > b ) return a;
else return b;
}
int high(tree root){
// 沒有左子樹 ,就算右子樹深度 +1
// 沒有右子樹 ,就算左子樹深度 +1
// 左右都沒有 , 就算 1
//最後都不為空的話,那麼就取較大值 +1
if ( (root->left == NULL) && (root ->right != NULL) )
return high(root->right) +1;
else if((root->left != NULL) &&( root->right == NULL))
return high(root->left) +1;
else if((root->left == NULL) && (root->right== NULL))
return 1;
else return(max(high(root->left) , high(root->right) ) +1);
}
/*計算距離最遠的兩個節點:1.可能都在根節點的左子樹上,2.也可能都在右子樹上,3.還有可能是根節點和深度最大的節點。
解法一,1.求出二叉樹的所有葉子節點。2.求任意兩個葉子節點的第一個祖先節點。3.計算具有祖先-子孫關係的兩個節點之間的路徑之和。
... 待續...
*/
int main(){
tree root;
creat(&root); //這裡需要更改root,之前的root沒有指向,所以要傳遞&(root)。
show(root);
printf("\n");
find_leaf(root);
int sum;
sum =total(root);
printf("總節點數是:%d\n" ,sum);
int depth;
depth = high(root);
printf("樹的深度是:%d\n" ,depth);
return 0;
}
新建立一棵二叉樹,遍歷,查詢樹的高度,查詢樹的葉子節點,和總結點數 然後再計算距離最遠的兩個節點。
SQ 2014-04-20
*/
#include<stdio.h>
struct Node{
int data;
struct Node * left;
struct Node * right;
};
typedef struct Node Node;
typedef struct Node * tree;
//一 ,新建立一棵樹void creat( tree *p){
int data;
scanf("%d",&data);
if(data == 0){
*p=NULL;
return ;
}
else {
*p=(tree)malloc(sizeof(Node));
(*p)->data = data;
creat(&((*p)->left));
creat(&((*p)->right));
}
}
//二 遍歷整棵樹,這裡採用的是先序遍歷
void show(tree root){
if(root == NULL)
return ;
else {
show(root->left);
printf("%d--->",root->data);
show(root->right);
}
}
//三,查詢樹的葉子節點(很明顯,左右孩子都為空的就是葉子節點)
void find_leaf( tree root){
if(root == NULL)
return ;
else {
find_leaf(root->left);
if(root->left == NULL && root->right == NULL)
printf("葉子節點是:%d\n",root->data);
find_leaf(root->right);
}
}
//, 查詢樹的總節點數:是左子樹的節點總數 + 1 + 右子樹的總節點數
int total(tree root){
if(root == NULL)
return ;
else return (total(root->left) + 1 + total(root->right));
}
//查詢樹的高度 :樹的深度就是其左、右子樹深度的較大值再加1
int max(int a, int b){
if (a > b ) return a;
else return b;
}
int high(tree root){
// 沒有左子樹 ,就算右子樹深度 +1
// 沒有右子樹 ,就算左子樹深度 +1
// 左右都沒有 , 就算 1
//最後都不為空的話,那麼就取較大值 +1
if ( (root->left == NULL) && (root ->right != NULL) )
return high(root->right) +1;
else if((root->left != NULL) &&( root->right == NULL))
return high(root->left) +1;
else if((root->left == NULL) && (root->right== NULL))
return 1;
else return(max(high(root->left) , high(root->right) ) +1);
}
/*計算距離最遠的兩個節點:1.可能都在根節點的左子樹上,2.也可能都在右子樹上,3.還有可能是根節點和深度最大的節點。
解法一,1.求出二叉樹的所有葉子節點。2.求任意兩個葉子節點的第一個祖先節點。3.計算具有祖先-子孫關係的兩個節點之間的路徑之和。
... 待續...
*/
int main(){
tree root;
creat(&root); //這裡需要更改root,之前的root沒有指向,所以要傳遞&(root)。
show(root);
printf("\n");
find_leaf(root);
int sum;
sum =total(root);
printf("總節點數是:%d\n" ,sum);
int depth;
depth = high(root);
printf("樹的深度是:%d\n" ,depth);
return 0;
}