/*
新建立一棵二叉树,遍历,查找树的高度,查找树的叶子节点,和总结点数 然后再计算距离最远的两个节点。
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;
}